1

次のような変数内に sed コマンドの開始を格納しようとしています。

sedcmd="sed -i '' "

後で、次のようなコマンドを実行します。

   $sedcmd s/$orig_pkg/$package_name/g $f

そして、それは機能しません。bash -x でスクリプトを実行すると、次のように展開されていることがわかります。

   sed -i ''\'''\''' 

これを表現する正しい方法は何ですか?

4

5 に答える 5

2

コマンドが 1 語だけの長さの場合に機能します。

$ LS=ls
$ $LS

しかし、あなたの場合、シェルは存在しないプログラムを実行しようとしています。 sed -i ''

回避策は次を使用すること$SHELL -cです。

$ $SHELL -c "$LS"
total 0

( の代わりに と$SHELLも言えますがbash、複数の Bash がインストールされている場合や、シェルが実際には Bash ではない場合など、完全に信頼できるわけではありません。)

ただし、ほとんどの場合、実際にはシェル関数を使用します。

sedcmd () {
    sed -i '' "$@"
}
于 2013-05-08T14:04:42.730 に答える
0

エイリアスや関数を使用しないのはなぜですか? あなたは次のようにエイリアスを行うことができます

alias sedcmd="sed -i '' "
于 2013-05-08T14:03:20.710 に答える
0

これはそれを行うための正しい方法です

alias sedcmd="sed -i ''"

bash を閉じると、このエイリアスはなくなることを忘れないでください。
「永続的」にしたい場合は、.bashrcホームファイル(これを単一のユーザーのみにしたい場合)または.bashrcグローバルファイルに追加する必要があります(すべてのユーザーが利用できるようにする場合)

于 2013-05-08T14:03:29.940 に答える
0

あなたが何をしようとしているのか正確にはわかりませんが、私の提案は次のとおりです。

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中のファイル名に設定する必要があります。

于 2013-05-08T14:23:38.530 に答える