bashスクリプトの最後に変数に関連する複数行を追加するには?

bashスクリプトの最後に変数に関連する複数行を追加するには?

私は以下を追加したいと思います:

function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p $@
}

コマンドラインで終了します~/.bashrc。私は以下を試してみました。

printf "function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}" >> ~/.bashrc

ほとんど動作しますが、入力フィールドは$@無視され、次のようになります。

function ps_mem {
 python /home/vagrant/ps_mem/ps_mem.py -p
}

代わりに最後に追加する必要があります~/.bashrc

答え1

この種の作業には、次の文書を使用してください。

cat <<'EOF' >>~/.bashrc
function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p "$@"
}
EOF

<<'EOF'シェルは、引用時にこの文書の特殊文字を拡張しません。 POSIXではシェルコマンド言語:

単語に引用符が含まれている場合は、[...]この文書行を展開しないでください。

答え2

"二重引用符を一重引用符に置き換えると、元の質問のprintfが機能します。

私はprintfこのように使用するのが好きです。などの特別な引用規則はありませんhere documents。そして何も考えずに\n。あなたが見るものはあなたが得るものです:

printf '%s' '
function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p "$@"
}
' >> ~/.bashrc

答え3

他の仕事に対する答えが与えられていますが、あなたがやろうとしていることを正確に実行するのを助けるという精神で(完全に良いアプローチであるため)、

元のテキストは次のとおりです。

printf "function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}" >> ~/.bashrc

動作するバージョンは次のとおりです。

printf 'function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}' >> ~/.bashrc

二重引用符も追加することをお勧めします$@

printf 'function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p "$@" \n}' >> ~/.bashrc

変数拡張は二重引用符で有効になり、一重引用符では無効になります。

答え4

希望の出力を得るには、次のようにエスケープシーケンスを使用できます。

  python /home/vagrant/ps_mem/ps_mem.py -p \$@ 

関連情報