(更新:元の質問を、スクリプト内の現在のコマンドへの引数ではなく、スクリプトへの引数を参照していると誤解しました。これは書き直された回答です。)
@choroba が言ったように、スクリプトでこのようなことを行うのは実際には正しい方法ではないため、履歴はスクリプトでデフォルトで無効になっています。
スクリプトでこのようなことを行うための推奨される方法は、問題の項目 (この場合はファイル名) を変数に格納し、コマンドで複数回参照することです。
fname=file1
ls -l "$fname" > "/path/$fname.txt"
スペースやその他のシェルのメタ文字が含まれている場合の問題を回避するために、ほとんどの場合、変数参照を二重引用符で囲む必要があることに注意してください (上記のように)。複数のファイルに対してこれを行う場合は、for
ループを使用します。
for fname in *; do # this will repeat for each file (or directory) in the current directory
ls -l "$fname" > "/path/$fname.txt"
done
現在のディレクトリ以外の場所にあるファイルを操作したい場合、状況はもう少し複雑になります。を使用できます/inputpath/*
が、各ファイル名とともにパスが含まれます (たとえば、「/inputpath/file1」、「/inputpath/file2」などでループを実行します)。それを出力で直接使用すると、リダイレクトすると、次のような結果が得られます> /path/inputpath/file1.txt
(つまり、2 つの異なるパスが一緒に追加されます)。この場合、basename
コマンドを使用して、出力目的で不要なパスを取り除くことができます。
for fpath in /inputpath/*; do
ls -l "$fpath" > "/path/$(basename "$fpath").txt"
done
特定の拡張子を持つファイルのリストが必要な場合は、必要に応じて*.foo
または/inputpath/*.foo
を使用してください。ただし、この場合、「file1.foo.txt」などの名前のファイルに出力されることになります。積み重ねられた拡張機能が必要ない場合はbasename
、それをトリミングするオプションもあります。
for fpath in /inputpath/*.foo; do
ls -l "$fpath" > "/path/$(basename "$fpath" .foo).txt"
done
最後に、(実際の操作がどれほど複雑であるか、スクリプトで複数回発生するかどうかに応じて) これを関数でラップし、それを使用する方が適切な場合があります。
doStuffWithFile() {
ls -l "$1" > "/path/$(basename "$1" "$2").txt"
}
for fpath in /inputpath/*.foo; do
doStuffWithFile "$fpath" ".foo"
done
doStuffWithFile /otherpath/otherfile.bar .bar