複数行の文字列リテラルを変数に割り当てるためのこの典型的なBashスクリプトイディオム:
read -r -d '' FILE_CONTENTS <<'EOF'
... contents ...
EOF
私がそれを使用したすべての場所で私にうまくサービスを提供してきました。
私は今日のようにこのイディオムを含むスクリプトを実行しroot
ます、そしてすべての地獄は負けました。ファイルが破損し、あらゆる種類の奇妙なものが空から落ちてきます。Macを気化させました。ところで、この間違いは破壊されました...基本的にすべて。もし私が核であることに賛成することができれば、私はそうするでしょう。自己破壊の有効性。
それを再現するための最小限の動作構成を提供させてください。
# Recreating a .vimrc file, for example
read -r -d '' FILE_CONTENTS <<'EOF'
let mapleader = "<space>"
let maplocalleader = "\\"
EOF
echo "${FILE_CONTENTS}" > .vimrc
これはユーザーとしては問題なく機能しますtinosino
が、rootとしては...バックスラッシュのあるものはすべて問題があります。
なんで?「違い」を探す場所は?オプション?環境?「エコー」のエイリアス(?!)私は迷子になっています。試しbash -x
ました:テストしているスクリプトのページと失敗のページ。ルートの設定で、何が何を変更した可能性がありますか?どこ?
OS X version: 10.8.2
Bash version: 3.2.48(1)-release
スクリプトにsh
Vsbash
ガードがありますが、それは機能しませんでした...それはひどく構築されていましたか?
if [ ${BASH_VERSION-not_running_within_bash} = not_running_within_bash ]; then
echo This script is meant to be executed by the Bash shell but it isn\'t.
echo Continuing from another shell may lead to unpredictable results.
echo Execution will be aborted... now.
return
fi
スクリプトの実行は停止しますが、停止zsh
しませんsh
...どうすればよいですか?
編集:私はスクリプトガードをこれに変更することにしました:
if [[ ! $(ps -p $$ -o comm | paste -s - | awk '{ print $NF }') == *bash* ]]; then