【发布时间】:2009-11-04 14:18:19
【问题描述】:
我想知道如何使用文件的内容作为命令行参数,但在语法上遇到了困难。
假设我有以下内容:
# cat > arglist
src/file1 dst/file1
src/file2 dst/file2
src/file3 dst/file3
如何将arglist 文件中每一行的内容用作cp 命令的参数?
【问题讨论】:
我想知道如何使用文件的内容作为命令行参数,但在语法上遇到了困难。
假设我有以下内容:
# cat > arglist
src/file1 dst/file1
src/file2 dst/file2
src/file3 dst/file3
如何将arglist 文件中每一行的内容用作cp 命令的参数?
【问题讨论】:
xargs 的“-n”选项指定每个命令使用多少个参数:
$ xargs -n2 < arglist echo cp
cp src/file1 dst/file1
cp src/file2 dst/file2
cp src/file3 dst/file3
【讨论】:
使用read(这确实假设arglist 中文件名中的任何空格都被转义了):
while read src dst; do cp "$src" "$dst"; done < argslist
如果文件中的参数顺序正确并且带有空格的文件名被引用,那么这也将起作用:
while read args; do cp $args; done < argslist
【讨论】:
你可以使用管道(|):
cat file | echo
或输入重定向(
cat < file
xargs sh -c 'emacs "$@" < /dev/tty' emacs
然后你可以使用 awk 来获取参数:
cat file | awk '{ print $1; }'
希望这会有所帮助..
【讨论】:
echo 不是从 stdin 读取的。除了cat 不需要echo。此外,您不必重定向到 cat - 这有效:cat file。
如果您的目的只是 cp 列表中的那些文件
$ awk '{cmd="cp "$0;system(cmd)}' file
【讨论】:
使用for 循环并将IFS(内部字段分隔符)设置为new line
OldIFS=$IFS # Save IFS
$IFS=$'\n' # Set IFS to new line
for EachLine in `cat arglist"`; do
Command="cp $Each"
`$Command`;
done
IFS=$OldIFS
【讨论】:
$Command 或 `$Command` 才能使其正常工作。