在BASH中将文件内容用作命令行参数

在BASH中将文件内容用作命令行参数,bash,redirect,Bash,Redirect,我想知道如何使用文件的内容作为命令行参数,但在语法方面遇到了困难 假设我有以下几点: # cat > arglist src/file1 dst/file1 src/file2 dst/file2 src/file3 dst/file3 如何使用arglist文件中每一行的内容作为参数来表示cp命令?您可以使用管道(|): 或输入重定向(Using)(这假定arglist中的文件名中的任何空格都被转义): 读取src dst时执行cp“$src”“$dst”已完成 如果文件中的参数顺序

我想知道如何使用文件的内容作为命令行参数,但在语法方面遇到了困难

假设我有以下几点:

# cat > arglist
src/file1 dst/file1
src/file2 dst/file2
src/file3 dst/file3
如何使用
arglist
文件中每一行的内容作为参数来表示
cp
命令?

您可以使用管道(|):

或输入重定向(Using)(这假定
arglist
中的文件名中的任何空格都被转义):

读取src dst时执行cp“$src”“$dst”已完成

如果文件中的参数顺序正确,并且引用了带空格的文件名,则这也将起作用:

while read args; do cp $args; done < argslist
读取参数时;执行cp$args;完成
xargs的'-n'选项指定每个命令要使用多少个参数:

$ xargs -n2 < arglist echo cp

cp src/file1 dst/file1
cp src/file2 dst/file2
cp src/file3 dst/file3
$xargs-n2
如果您的目的只是对列表中的文件进行cp

$ awk '{cmd="cp "$0;system(cmd)}' file

使用
进行
循环,将
IFS
(内部字段分隔符)设置为
新行

OldIFS=$IFS # Save IFS
$IFS=$'\n' # Set IFS to new line
for EachLine in `cat arglist"`; do
Command="cp $Each"
`$Command`;
done
IFS=$OldIFS

所有这些都做了些事情,但都偏离了目标。
echo
不读取
stdin
。此外
cat
不需要
echo
。此外,你不必重定向到
cat
-这是有效的:
cat文件
。是的,我知道,一开始我不太明白他想要什么。我知道了输出类似于“ls”,我的意思是在cols上使用更少的行。这就是为什么我谈到shell重定向。(英语不是我的第一语言,对不起:))没有必要将命令及其参数放入变量中。无论如何,您必须执行
$Command
`$Command`
,才能使其正常工作。使用shell时没有什么不同。shell也在调用系统命令。如果没有最后一行换行符,则while read循环将“错过”读取最后一行。
while read src dst; do cp "$src" "$dst"; done < argslist
while read args; do cp $args; done < argslist
$ xargs -n2 < arglist echo cp

cp src/file1 dst/file1
cp src/file2 dst/file2
cp src/file3 dst/file3
$ awk '{cmd="cp "$0;system(cmd)}' file
OldIFS=$IFS # Save IFS
$IFS=$'\n' # Set IFS to new line
for EachLine in `cat arglist"`; do
Command="cp $Each"
`$Command`;
done
IFS=$OldIFS