Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将回波输出管道化到xargs_Bash_Xargs - Fatal编程技术网

Bash 将回波输出管道化到xargs

Bash 将回波输出管道化到xargs,bash,xargs,Bash,Xargs,我正试图通过xargs传递一个值列表。下面是一个简单的例子: echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon 我预计这将产生以下结果: Hello Landon Hola Landon Bonjour Landon 相反,该命令输出以下内容: Hello Hola Bonjour Landon 我缺少什么?需要更改分隔符,还必须指定-L选项。因此,要么像另一个答案建议的那样通过-d更改分隔符,要么将管道改为sed并用换行符替换空格

我正试图通过
xargs
传递一个值列表。下面是一个简单的例子:

echo "Hello Hola Bonjour" | xargs -I _ echo _ Landon
我预计这将产生以下结果:

Hello Landon
Hola Landon
Bonjour Landon
相反,该命令输出以下内容:

Hello Hola Bonjour Landon

我缺少什么?

需要更改分隔符,还必须指定-L选项。因此,要么像另一个答案建议的那样通过-d更改分隔符,要么将管道改为sed并用换行符替换空格

echo "Hello Hola Bonjour" | sed -e 's/ /\n/g' | xargs -L 1 -I _ echo _ Landon
导致

Hello Landon
Hola Landon
Bonjour Landon
有时仅仅更改分隔符是不够的。xargs有时会获取所有输入参数并一次传递所有参数。争论不存在分裂

e、 g

seq 1 7 | xargs echo
导致

1
2
3
4
5
6
7
正在传递给xargs,因此输出将

  1 2 3 4 5 6 7
如果在xargs手册页中添加-L 1

-L最大线 每个命令行最多使用最大行非空输入行。尾随空格导致输入行被删除 在下一个输入行逻辑上继续。意味着-x

那你就会明白了

1
2
3
4
5
6
7
您还可以手动将其转换为for循环,这样可以更轻松地设置多行语句

# be absolutely sure the values the for loop iterates over is well sanitized to avoid glob expansion of the *.
for i in Hello Hola Bonjour
do
  if [ "$i" = "Hello" ]
  then
    echo "$i Landon, language detected as English!"
  else
    echo "$i Landon, language detected as non English."
  fi
done

-I
下,
人xargs

不带引号的空格不终止输入项;而是 分隔符是换行符

您可以指定不同的分隔符(至少在GNU xargs中):

更便于携带的是,使用
\0
作为分隔符,使用
-0
作为分隔符:

printf '%s\0' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon

I标志将分隔符更改为换行符

不带引号的空格不终止输入项;相反,分隔符是换行符

你可以读到它

必须手动将分隔符指定为空格。默认情况下,Echo还会插入一个换行符,这会弄乱xargs。使用-n标志删除换行符

下面是固定命令:

echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon

echo“Hello Hola Bonjour”| xargs printf“%s Landon\n”
(由于
printf
在看到额外参数时重用其格式字符串,
printf“%s Landon\n”Hello Hola Bonjour
将打印您期望的三行)。一般来说,
xargs-I
是最好避免的;它在应用于常见用例时存在严重的(安全)问题(如替换为
sh-c'…'
strings)。对macOS有什么建议吗?
-d
标志不可用。@LandonSchropp…通常,最好的做法是使用NUL分隔符,而不是空格或换行符:
printf“%s\0”你好,你好,你好,你好,xargs-0-I_uuu.echo_uuu.Landon
。NUL是C字符串(文件名等)中唯一不能存在的字符,因此它是唯一保证用于分隔任意字符串安全的东西;并且
xargs-0
在MacOS上可用。@LandonSchropp Mac有基本上不可移植的BSD工具。您可以安装更便携的GNU版本,该版本
brew安装findutils
。有一些额外的细节。
printf '%s\0' Hello Hola Bonjour | xargs -0 -I _ echo _ Landon
echo -n "Hello Hola Bonjour" | xargs -d' ' -I _ echo _ Landon