나는 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에 대해 어딘가에서 읽었습니다(포스트가 기억나지 않아서 죄송합니다).
그래서 나는 cron을 다음과 같이 프로그래밍하도록 요청(간청)했습니다: (nice -n19는 "기본값"으로, 피할 수 없습니다)
nice -n19 bash -x -o igncr ./_private/myScript.sh
bash -x -o igncr nice -n19 ./_private/myScript.sh
두 가지 경우: bash: line 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"에는 UTF-8과 동일한 캐리지 리턴(CR) 및 줄 바꿈(LF) 문자가 있습니다. (그리고 EBCDIC이 언급되었기 때문에 두 가지 모두와 또 다른 개행 문자가 있는 것 같습니다. 실제로 사용하는 이상한 시스템은 완전히 다른 문제입니다.)
따라서 편집기가 줄 바꿈/줄 바꿈만 포함하는 Unix 스타일 줄 끝을 생성하도록 하려면 다른 설정을 찾아야 합니다. 그러나 FTP를 통해 시스템에 파일을 전송한다고 언급하셨는데, 가능하다면 이 방식으로 올바르게 작성된 파일을 전송하는 데 방해가 될 만한 것이 없어야 합니다.
이제 어떤 스크립트가 "예기치 않은 파일 끝" 오류를 발생시켰는지 표시하지 않았지만 이는 일반적으로 쉘에 닫는 따옴표가 필요하거나 복합 명령을 완료하기 위해 특정 키워드가 있어야 하는 경우 발생합니다. 쉘이 그 반대 를 본다면 이는 키워드로 인식되지 then
않습니다 .fi
if
do
done
then\r
그러나 CR을 주석 처리하는 방법은 여전히 작동합니다. CR+LF 줄 끝이 있어도 Bash는 다음과 같은 내용을 잘 읽을 수 있습니다.
if true; then #
echo moi #
fi #
그러나 해시뱅 라인이 더 문제입니다. 특히 Linux는 인터프리터 이름 뒤의 모든 것을 단일 인수로 스택하기 때문에 CR을 무시하는 방법을 생각할 수 없습니다. 그러나 셸에서 오류를 받았다면 아마도 셸(적어도 일부 셸)에서 스크립트를 실행하고 있을 것입니다.