これらの4つのコマンドはすべて、関数呼び出しで問題なく機能します。必要に応じて検索仕様を調整します。これらはすべて、ファイル名のスペースに対応しています。個人的には、別のbashインスタンスにシェルアウトする意味がわかりませんが、bashを呼び出す2つのバージョンが含まれています。
IFS=$'\n'; f=($(find /tmp -maxdepth 1 -name "$USER.*")); f7zipi "${f[@]}"
IFS=; find /tmp -maxdepth 1 -name "$USER.*" | while read -r f ;do f7zipi "$f"; done
IFS=$'\n'; bash -c 'IFS=; f7zipi "$@"' 0 $(find /tmp -maxdepth 1 -name "$USER.*")
find /tmp -maxdepth 1 -name "$USER.*" -exec bash -c 'IFS=; f7zipi "$@"' 0 {} +;
以下は、Ubuntu10.04でGNUbash4.1.5を使用して関数を設定した方法です。
ところで。同じ名前の呼び出し元のスクリプトの変数と 衝突しないlocal f
ように、関数で使用する必要があります。
これはまさに私が〜/.bashrcに追加したものです
function f7zipi() {
local f
for f in $@; do
ls -alF "$f"
7za a -si -t7z -m0=lzma -mx=9 -mfb=64 \
-md=64m -ms=on "$f.7z" < "$f" &&
touch -r "$f" "$f.7z" &&
rm -fv "$f" &&
ls -alF "$f.7z"
done
}
export -f f7zipi
上記の関数を端末のbashコマンドラインに割り当てるだけで、そのコマンドラインから実行されているスクリプトは、関数を呼び出すときに失敗します...export -f f7zipi
同じコマンドラインにさらに適用すると、スクリプトは成功します...しかし、 sciptは、その特定のコマンドラインセッションでのみ機能します。
関数とエクスポートがに含まれている~/bashrc
場合、スクリプトはすべてのbashセッションで毎回機能します。
これはテストスクリプトです
#!/bin/bash
f=/tmp/$USER.abc
g=/tmp/$USER.lmn
rm -fv "$f" "$f".7z
rm -fv "$g" "$g".7z
printf 'abcdefg'>"$f"
printf 'lmnopqr'>"$g"
IFS=$'\n'; f=($(find /tmp -maxdepth 1 -name "$USER.*")); f7zipi "${f[@]}"
exit