0

複数行の文字列リテラルを変数に割り当てるためのこの典型的なBashスクリプトイディオム:

read -r -d '' FILE_CONTENTS <<'EOF'
... contents ...
EOF

私がそれを使用したすべての場所で私にうまくサービスを提供してきました。

私は今日のようにこのイディオムを含むスクリプトを実行しrootます、そしてすべての地獄は負けました。ファイルが破損し、あらゆる種類の奇妙なものが空から落ちてきます。Macを気化させました。ところで、この間違いは破壊されました...基本的にすべて。もし私が核であることに賛成することができれば、私はそうするでしょう。自己破壊の有効性。


原子力
(出典:iliketowastemytime.com


それを再現するための最小限の動作構成を提供させてください。

# 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

スクリプトにshVsbashガードがありますが、それは機能しませんでした...それはひどく構築されていましたか?

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
4

2 に答える 2

2

ルートは通常、スクリプトを#!/ bin/shとして実行することを忘れないでください

#!/bin/bashあなたが説明するエラーは、で実行するために書かれたスクリプトのように聞こえます#!/bin/sh。一部のシステム#!/bin/shはを指して#!/bin/bashいるため、bash-ismedコードは機能しますが、真のBourne Shell(#!/bin/sh)を使用して実行すると、bashismによってスクリプトが失敗し、場合によっては、非常に壊滅的な方法で失敗します。

BASH_VERSIONのテストに気付くだけです。良いアイデア。私はそれがのためにあなたが期待することをしないと確信しています=-eq代わりに試してください。テストする真のBourneShellがありません。

申し訳ありませんが、幸運を祈ります。

于 2012-10-09T19:58:05.080 に答える
0

これはそれを行う別の方法です:

#!/bin/bash
(
cat <<'EOF'
let mapleader = "<space>"
let maplocalleader = "\\"
EOF
) > .vimrc
于 2012-10-09T19:17:33.910 に答える