web-dev-qa-db-ja.com

Linux用Windowsサブシステムで「set -eo pipefail」が機能しない(Ubuntu 16.04)

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つの異なる質問が出されました。

2
phydeauxman

^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
4
steeldriver