Ubuntu 16.04をエミュレートすることになっているWindows 10マシンにLinux用のWindowsサブシステムをインストールしました。スクリプトの先頭に次の2行があるスクリプトを実行しようとすると、エラー:invalid option name set: pipefail
が表示されます
スクリプト行:
#!/bin/bash
set -eo pipefail
このスクリプトは、私のMacおよび私が持っているCentOSシステムで正常に動作します。 set -o
を実行して、bashでpipefailオプションをサポートしていることを確認するために、Ubuntuシェルをチェック(および検証)しました。
cat -net /path/to/myscript
の出力は次のとおりです。
#!/bin/bash^M$
set -eo pipefail^M$
この質問は、「Windowsの行末をUnixバージョンに変更する方法」の複製としてマークされましたが、私が抱えていた問題を個人的に知りませんでしたので、それが重複しているとは思いません(質問で概説されています)シェルスクリプトの行末のタイプが原因でした。各質問の答えは同じですが、2つの異なる質問が出されました。
^M
出力のcat -net
シーケンスで示されるように、Unixスタイル(LFのみ)ではなく、Windowsスタイル(CRLF)の行末でスクリプトを保存しました。
実際、切り捨てられたエラーメッセージから推測できました。「本当の」エラーは、pipefail\r
が無効なオプション名であるということです。ただし、キャリッジリターンにより、カーソルが行の先頭にリセットされ、先行する文字が上書きされます。比較する
$ cat -net bad.sh
1 #!/bin/bash$
2 set -eo fhqwhgads$
$ ./bad.sh
./bad.sh: line 2: set: fhqwhgads: invalid option name
そして
$ cat -net bad.sh
1 #!/bin/bash$
2 set -eo pipefail^M$
$ ./bad.sh
: invalid option name: pipefail