Bash
Bash 不將此處的文件輸出到文件
這個
bash
腳本似乎壞了:#!/bin/bash echo "It prints ok" cat << 'EOF' > ~/doFoo.sh echo 'nested script doing Foo' EOF echo "It never prints" cat << 'EOF' > ~/doBar.sh echo 'nested script doing Bar' EOF echo "It never prints too" # Here there is no doFoo.sh or doBar.sh in ~ ls -l ~/doFoo.sh ~/doBar.sh
該腳本僅列印第一條消息 (
It prints ok
) 並創建一個名為doFoo.sh'$'\r'
以下內容的文件:echo 'nested script doing Foo' EOF echo "It never prints" cat << 'EOF' > ~/doBar.sh echo 'nested script doing Bar' EOF echo "It never prints too" # Here there is no doFoo.sh or doBar.sh in ~
@Jim L. 添加您告訴確切輸出的行後,仍然是:
It prints ok
僅此而已。
您使用將腳本保存為 DOS 文本文件的編輯器在 Windows 系統上編寫腳本。根據評論,您隨後
nano
在 Unix 系統上對其進行了幾次編輯。Unix 上的大多數文本編輯器,nano
包括在內,都會注意到文本文件是 DOS 格式,然後在以後保存文件時保留這種格式。對於nano
,如果您使用-u
或啟動編輯器--unix
,它將始終以 Unix 文本格式保存。由於 DOS 文本文件有“crlf”(輸入+換行)換行符,而 Unix 文本文件有“lf”(換行)換行符,這意味著當被 Unix 工具讀取時,每一行現在在它的結尾(不可見,但通常編碼為
^M
or\r
)。這些輸入會干擾腳本中的命令。例如,這使得 shell 無法找到
EOF
第一個 here-document 的結尾,正如該行實際所說的那樣EOF\r
,notEOF
。
cat -v
如果您在腳本上使用,您會看到輸入:$ cat -v script #!/bin/bash^M echo "It prints ok"^M cat << 'EOF' > ~/doFoo.sh^M echo 'nested script doing Foo'^M EOF^M echo "It never prints"^M cat << 'EOF' > ~/doBar.sh^M echo 'nested script doing Bar'^M EOF^M echo "It never prints too"^M # Here there is no doFoo.sh or doBar.sh in ~^M
只需使用 將您的腳本文件轉換為 Unix 腳本文件
dos2unix
,它將被修復,或者在使用或如上所述nano
開始後將文本保存在其中。nano``-u``--unix
$ dos2unix script dos2unix: converting file script to Unix format...
$ cat -v script #!/bin/bash echo "It prints ok" cat << 'EOF' > ~/doFoo.sh echo 'nested script doing Foo' EOF echo "It never prints" cat << 'EOF' > ~/doBar.sh echo 'nested script doing Bar' EOF echo "It never prints too" # Here there is no doFoo.sh or doBar.sh in ~