次のような変数内に sed コマンドの開始を格納しようとしています。
sedcmd="sed -i '' "
後で、次のようなコマンドを実行します。
$sedcmd s/$orig_pkg/$package_name/g $f
そして、それは機能しません。bash -x でスクリプトを実行すると、次のように展開されていることがわかります。
sed -i ''\'''\'''
これを表現する正しい方法は何ですか?
次のような変数内に sed コマンドの開始を格納しようとしています。
sedcmd="sed -i '' "
後で、次のようなコマンドを実行します。
$sedcmd s/$orig_pkg/$package_name/g $f
そして、それは機能しません。bash -x でスクリプトを実行すると、次のように展開されていることがわかります。
sed -i ''\'''\'''
これを表現する正しい方法は何ですか?
コマンドが 1 語だけの長さの場合に機能します。
$ LS=ls
$ $LS
しかし、あなたの場合、シェルは存在しないプログラムを実行しようとしています。 sed -i ''
回避策は次を使用すること$SHELL -c
です。
$ $SHELL -c "$LS"
total 0
( の代わりに と$SHELL
も言えますがbash
、複数の Bash がインストールされている場合や、シェルが実際には Bash ではない場合など、完全に信頼できるわけではありません。)
ただし、ほとんどの場合、実際にはシェル関数を使用します。
sedcmd () {
sed -i '' "$@"
}
エイリアスや関数を使用しないのはなぜですか? あなたは次のようにエイリアスを行うことができます
alias sedcmd="sed -i '' "
これはそれを行うための正しい方法です
alias sedcmd="sed -i ''"
bash を閉じると、このエイリアスはなくなることを忘れないでください。
「永続的」にしたい場合は、.bashrc
ホームファイル(これを単一のユーザーのみにしたい場合)または.bashrc
グローバルファイルに追加する必要があります(すべてのユーザーが利用できるようにする場合)
あなたが何をしようとしているのか正確にはわかりませんが、私の提案は次のとおりです。
sedcmd="sed -i "
$sedcmd s/$orig_pkg/$package_name/g $f
最初にシェルで変数orig_pkg
package_name
を設定する必要があります。f
ファイル内の変数名を置き換える場合は、次を試してください。
$sedcmd s/\$orig_pkg/\$package_name/g $f
作業f
中のファイル名に設定する必要があります。