我正在 Centoss 远程服务器上通过 cPanel 编写一个愚蠢的脚本,对此我无能为力,脚本需要不时更改,并且每次通过 ftp 上传都会因为这个过程而变得烦人。
(该脚本直接从系统在 cron 上运行,我们无法更改它;是的,我们可能应该切换可能的提供者,但现在不应该切换到别人手中)
对于每个空行,它都会返回 $'\r': command not find ,这意味着编辑器添加了那些蹩脚的结束行,所以我必须通过在每个空行上放置一个散列(注释)来克服它。然而,这会引发另一个错误,如“意外的文件结尾”等......
我确信 99.99% 是由于在线编辑器保存文件的编码......(同样,我们基本上被迫使用这个编辑器)
编辑器,它允许使用所有这些编码:
- ansi_x3.110-1983
- ansi_x3.4-1968
- armscii-8
- asmo_449
- big5
- big5-hkscs
- brf
- bs_4730
- bs_viewdata
- cp10007
- cp1125
- cp1250
- cp1253
- cp1254
- cp1255
- cp1256
- cp1257
- cp1258
- cp737
- cp770
- cp771
- cp772
- cp773
- cp774
- cp775
- csa_z243.4-1985-1
- csa_z243.4-1985-2
- csa_z243.4-1985-gr
- csn_369103
- cwi
- dec-mcs
- din_66003
- ds_2089
- ebcdic-at-de
- ebcdic-at-de-a
- ebcdic-ca-fr
- ebcdic-dk-no
- ebcdic-dk-no-a
- ebcdic-es
- ebcdic-es-a
- ebcdic-es-s
- ebcdic-fi-se
- ebcdic-fi-se-a
- ebcdic-fr
- ebcdic-is-friss
- ebcdic-it
- ebcdic-pt
- ebcdic-uk
- ebcdic-us
- ecma-cyrillic
- es
- es2
- euc-jisx0213
- euc-jp
- euc-jp-ms
- euc-kr
- euc-tw
- gb18030
- gb2312
- gb_1988-80
- gbk
- georgian-academy
- georgian-ps
- gost_19768-74
- greek-ccitt
- greek7
- greek7-old
- gsm03.38
- hp-greek8
- hp-roman8
- hp-roman9
- hp-thai8
- hp-turkish8
- hz-gb-2312
- ibm037
- ibm038
- ibm1004
- ibm1026
- ibm1047
- ibm1124
- ibm1129
- ibm1132
- ibm1133
- ibm1160
- ibm1161
- ibm1162
- ibm1163
- ibm1164
- ibm256
- ibm273
- ibm274
- ibm275
- ibm277
- ibm278
- ibm280
- ibm281
- ibm284
- ibm285
- ibm290
- ibm297
- ibm420
- ibm423
- ibm424
- ibm437
- ibm500
- ibm850
- ibm851
- ibm852
- ibm855
- ibm856
- ibm857
- ibm858
- ibm860
- ibm861
- ibm862
- ibm863
- ibm864
- ibm865
- ibm866
- ibm866nav
- ibm868
- ibm869
- ibm870
- ibm871
- ibm874
- ibm875
- ibm880
- ibm891
- ibm903
- ibm904
- ibm905
- ibm918
- ibm922
- iec_p27-1
- inis
- inis-8
- inis-cyrillic
- invariant
- isiri-3342
- iso-8859-1
- iso-8859-10
- iso-8859-11
- iso-8859-13
- iso-8859-14
- iso-8859-15
- iso-8859-16
- iso-8859-2
- iso-8859-3
- iso-8859-4
- iso-8859-5
- iso-8859-6
- iso-8859-7
- iso-8859-8
- iso-8859-9
- iso-8859-9e
- iso-ir-197
- iso-ir-209
- iso-ir-90
- iso_10367-box
- iso_10646
- iso_11548-1
- iso_2033-1983
- iso_5427
- iso_5427-ext
- iso_5428
- iso_646.basic
- iso_646.irv
- iso_6937
- iso_6937-2-25
- iso_6937-2-add
- iso_8859-1,gl
- iso_8859-supp
- it
- jis_c6220-1969-jp
- jis_c6220-1969-ro
- jis_c6229-1984-a
- jis_c6229-1984-b
- jis_c6229-1984-b-add
- jis_c6229-1984-hand
- jis_c6229-1984-hand-add
- jis_c6229-1984-kana
- jis_x0201
- johab
- jus_i.b1.002
- jus_i.b1.003-mac
- jus_i.b1.003-serb
- koi-8
- koi8-r
- koi8-ru
- koi8-t
- koi8-u
- ks_c_5601-1987
- ksc5636
- latin-greek
- latin-greek-1
- mac-centraleurope
- mac-cyrillic
- mac-is
- mac-sami
- mac-uk
- macintosh
- mik
- msz_7795.3
- nats-dano
- nats-dano-add
- nats-sefi
- nats-sefi-add
- nc_nc00-10
- nextstep
- nf_z_62-010
- nf_z_62-010_1973
- ns_4551-1
- ns_4551-2
- pt
- pt154
- pt2
- rk1048
- sami
- sami-ws2
- sen_850200_b
- sen_850200_c
- shift_jis
- shift_jisx0213
- t.101-g2
- t.61-7bit
- t.61-8bit
- tcvn5712-1
- tis-620
- tscii
- us-ascii
- utf-7
- utf-8
- videotex-suppl
- viscii
- windows-1251
- windows-1252
- windows-31j-
有些似乎不兼容,因为文件无法加载,其他则加载文件但不断给出相同的错误...
我没有找到可以解决问题的 Unix 文件编码
我可以使用什么编码?
一些(在askubuntu上,在帖子关闭之前)建议使用dos2unix,如果我可以更多地访问系统、控制台、可以安装软件包......等等,那就太好了。
我可以通过 cPanel 编写脚本吗?
更新01:
我尝试:
export SHELLOPTS
set -o igncr
作为https://superuser.com/questions/330781/trouble-editing-bash-profile-bash-r-command-not-found/330783建议,
然后我得到:
./_private/myScript.sh: line 2: export: `SHELLOPTS ': not a valid identifier
./_private/myScript.sh: line 3: set: igncr : invalid option name
更新02:
我在某处读到(抱歉不记得帖子)关于 -o igncr
所以我要求(恳求)对crons进行编程,如下所示:(很好的-n19作为“默认”,不可避免)
nice -n19 bash -x -o igncr ./_private/myScript.sh
bash -x -o igncr nice -n19 ./_private/myScript.sh
两种情况: bash: 第 0 行: bash: igncr: 选项名称无效
我猜,用条件启动脚本
sed -i'.bak' s/\r//g ~/myScript.sh
如果在脚本中找到 \r ?
(灵感来自于https://stackoverflow.com/questions/11616835/r-command-not-found-bashrc-bash-profile)
答案1
我只读了前几行(太长)。但\r
表明您正在 MS-Windows 计算机上进行编辑。 MS-Windows 以不兼容的方式进行行结束 ( \r\n
)。其他系统则有( \n
)。
解决方案:
- 不要使用 MS-Windows
- 使用可配置为使用正确行结束符的编辑器。
dos2unix
导入时将文件放入。
答案2
行结束问题与字符集没有直接关系,例如Windows使用的“代码页1252”有回车符(CR)和换行符(LF),与UTF-8相同。(而且,既然提到了 EBCDIC,它似乎两者都有,再加上另一个换行符。它实际使用的奇怪系统完全是另一回事。)
因此,您需要找到另一个设置来使编辑器创建 Unix 风格的行结尾,仅包含换行符/换行符。不过,您还提到通过 FTP 将文件传输到系统,如果可能的话,应该没有什么可以阻止您以这种方式传输正确写入的文件。
现在,您没有显示哪个脚本给您带来了“意外的文件结尾”错误,但如果 shell 需要结束引号,或者必须出现某些关键字才能完成复合命令,则通常会发生这种情况。这些将是诸如then
和fi
为if
; 如果 shell 看到的do
是相反的,它不会将其识别为关键字。done
then\r
然而,注释掉 CR 的技巧应该仍然有效。即使使用 CR+LF 行结尾,Bash 也可以很好地读取这样的内容:
if true; then #
echo moi #
fi #
不过,hashbang 线更是一个问题。我想不出一种方法来忽略那里的 CR,特别是 Linux 将解释器名称后面的所有内容都堆叠到一个参数。但是,如果您已经从 shell 收到错误,则您可能正在由 shell(至少是某个 shell)执行脚本。