rm
ファイルが最初にコピーされ、次にコマンドが/tmp/recycle_bin
実行されたときに削除されるように、rmコマンドのエイリアスを作成します。ところで途中で問題が生じました。
私が行ったステップ:
~/.bashrc
ファイルに次のコマンドを作成しました。alias rm='cp $@ /tmp/recycle_bin && rm $@'
次のコマンドを使用して実行します。
. ~/.bashrc
新しい端末を開き、次のコマンドを実行します。
rm "/home/XXXXX/My_Programs/test_method.py" cp: missing destination file operand after '/tmp/recycle_bin'** got this error message
知る必要があります:
パラメータも削除したいファイルとしてrmコマンドに渡されます。 **次の後にターゲットファイルオペランドがありません。というエラーが発生するのはなぜですか
/tmp/recycle_bin
?エイリアスコマンドの変数
$@
が埋められていませんか?この状況をデバッグして解決する方法は?
ベストアンサー1
エイリアスは$@
パラメータを受け入れることができず、それを使用してこのようにパラメータにアクセスすることはできません。
エイリアス拡張はbash
単純なテキスト置換です。存在する場合は、alias rm ='something something'
次のようにrm file1 file2
実行されます。
something something file1 file2
エイリアスが含まれている場合は、$@
コマンドライン引数に展開されます。シェル、エイリアスではありません。
あなたの場合、シェルのコマンドライン引数のリストが空であると仮定すると、エイリアスは
alias rm='cp $@ /tmp/recycle_bin && rm $@'
次のように実行されます。
cp /tmp/recycle_bin && rm file1 file2
rm file1 file2
。として呼び出されると、cp
ユーティリティはオペランドが1つしかないと文句を言います。
代わりにシェル関数を使用できます。
rm () {
cp -- "$@" "${TMPDIR:-/tmp}/recycle_bin" &&
command rm -- "$@"
}
指定されたファイルをコピーして$TMPDIR/recycle_bin
(設定されていないか空の/tmp/recycle_bin
場合TMPDIR
)、そのファイルを削除します。このcommand
コマンドは、無限再帰を発生させないために使用されます。すべてのパラメータは--
オプションではなくファイル名で処理する必要があります。また、ファイル名がスペースに分割されず、引数のファイル名グロービングパターンが目的のファイルを選択しないように、引用符が重要です。いいえ削除したいです。
もっと効率的です(cp
+ rm
== mv
):
rm () {
mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
もう少し安全です。 (存在しない場合はごみ箱を作成してください):
rm () {
mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
GNUを使用する方がはるかに安全ですmv
(名前の競合が発生した場合はごみ箱にバックアップを作成します)。
rm () {
mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
mv -b -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
エイリアスのみ(およびGNUのみ)バリアントについては、関数を使用せずにごみ箱機能を作成する」。