Bash

Bash 不將此處的文件輸出到文件

  • March 16, 2021

這個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 工具讀取時,每一行現在在它的結尾(不可見,但通常編碼為^Mor \r)。這些輸入會干擾腳本中的命令。

例如,這使得 shell 無法找到EOF第一個 here-document 的結尾,正如該行實際所說的那樣EOF\r,not EOF

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 ~

引用自:https://unix.stackexchange.com/questions/639434