改訂された質問
ファイル「mycp」を作成しようとしています
#!/bin/bash -fx
cp $2 $1
そしてそれを
mycp myDir "*sh"
その場合、まだ必要ですeval
が、次のように記述します。
#!/bin/bash -x
eval cp "$2" "$1"
オプションを指定したため、問題が発生してい-f
ます。 man bash
言います(一部):
単語分割の後、-f
オプションが設定されていない限り、bash は各単語をスキャンして文字*
、?
、およびを探します[
。
f
スクリプトの「shebang」(最初の) 行から を削除します。
元の質問
引数でシェル展開を行いたい場合mycp "*sh*" aa
、おそらくeval
スクリプトで次のように使用することになります。
eval cp "$@"
ただし、 の使用eval
は危険です。予期しない副作用につながる可能性があります。の使用"$@"
は重要です。引数とスペースの数が保持されます。残念ながら、eval
then を使用すると元に戻せますが、すべてを取得することはできません (または簡単ではありません)。
かなり長い間 (たとえば 1987 *から 1999 年まで)、私はこのスクリプトを の表紙として使用していましたcp
。
: "@(#)$Id: cp.sh,v 1.3 1997/06/02 21:45:00 johnl Exp $"
#
# Alternative copy command
case $# in
0) /bin/cp ;;
1) /bin/cp $1 . ;;
2) /bin/cp "$@" ;;
*) if [ -d `la "$@"` ]
then /bin/cp "$@"
else /bin/cp "$@" .
fi;;
esac
('last argument')と呼ばれる非常に単純な C プログラムを使用してla
最後の引数を取得し、指定された最後の引数がディレクトリかどうかをチェックします。99% 以上の確率で、(偶然にも) 'cp /some/where/ sh ' と入力した場合cp /some/where/*sh* .
、2 番目が意図したものであり、スクリプトによって修正されました。かなり長い間使用していません。それは最後の千年紀にあったかもしれませんが、私がそれを使うのをやめたのは、おそらくこの千年紀の早い時期でした.
※ バージョン文字列は「1997」となっていますが、コードは1987年版と同一です。バージョン 1.1 と 1.2 は SCCS の下にあり、異なる SCCS ID 文字列を使用していました。RCS への変換により、それらは同一になりました。バージョン 1.3@(#)
では、SCCSwhat
コマンドで使用される識別子文字列が RCS バージョンの処理に復活しました。つまり、スクリプトは古いものです — 本当に 1987 年です。