xargs 中 bash 中的转义字符串替换功能如何?
how do escape string replacement function in bash in xargs?
我试图在 xargs 中使用 bash 的字符串替换功能。但是我不断收到错误的替换错误。
我尝试使用的命令:
ls / | xargs -I{} sh -c 'x={};echo ${x/something/somethingelse}'
我可以用 sed 来完成,但我无法弄清楚上面的命令有什么问题。
错误信息:
sh: 1: 替换错误
正如 KamilCuk 在下面所述,这主要是由于使用短划线作为 /bin/sh。
问题:
${var/a/b}
扩展是一项 Bash 功能,其他 shell 可能不可用(最值得注意的是 dash
)。
不解析 ls。 https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do-instead
'x={};
{}
部分根据 shell 语法规则由 shell 解释。
xargs
默认解释输入字符串中的 "
'
\
。
补救措施:
- 如果您打算使用 Bash 功能,请明确调用 Bash。
- 不要使用
ls
。 (或忽略最佳实践)
- 不要在
-c
脚本中使用 {}
。使用参数。记得引用参数扩展。
- 明确指定
xargs
的定界符。
例如:
printf "%s\n" /* | xargs -d '\n' -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --
printf "%s\n" /* | xargs -d '\n' -I{} bash -c 'x=""; echo ${x/something/somethingelse}' -- {}
find / -maxdepth 1 -mindepth 1 | xargs -d '\n' -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --
find / -mindepth 1 -mindepth 1 -print0 | xargs -0 -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --
我试图在 xargs 中使用 bash 的字符串替换功能。但是我不断收到错误的替换错误。 我尝试使用的命令:
ls / | xargs -I{} sh -c 'x={};echo ${x/something/somethingelse}'
我可以用 sed 来完成,但我无法弄清楚上面的命令有什么问题。
错误信息: sh: 1: 替换错误
正如 KamilCuk 在下面所述,这主要是由于使用短划线作为 /bin/sh。
问题:
${var/a/b}
扩展是一项 Bash 功能,其他 shell 可能不可用(最值得注意的是dash
)。不解析 ls。 https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do-instead
'x={};
{}
部分根据 shell 语法规则由 shell 解释。xargs
默认解释输入字符串中的"
'
\
。
补救措施:
- 如果您打算使用 Bash 功能,请明确调用 Bash。
- 不要使用
ls
。 (或忽略最佳实践) - 不要在
-c
脚本中使用{}
。使用参数。记得引用参数扩展。 - 明确指定
xargs
的定界符。
例如:
printf "%s\n" /* | xargs -d '\n' -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --
printf "%s\n" /* | xargs -d '\n' -I{} bash -c 'x=""; echo ${x/something/somethingelse}' -- {}
find / -maxdepth 1 -mindepth 1 | xargs -d '\n' -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --
find / -mindepth 1 -mindepth 1 -print0 | xargs -0 -n1 bash -c 'x=""; echo ${x/something/somethingelse}' --