所有这四个命令都可以与函数调用一起正常工作。根据需要调整您的查找规范。它们都适合文件名中的空格。就个人而言,我看不出使用另一个 bash 实例的意义,但我已经包含了两个调用 bash 的版本。
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 {} +;
下面是我如何设置功能,在 Ubuntu 10.04 中使用 GNU bash 4.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