无法在xargs中使用环境变量

7

团队,我在执行xargs命令时无法看到变量替换。有什么提示,如何替换$hostname?在我的系统上,主机名是一个命令而不是在环境中定义的变量。但我也可以将其设置为变量。

hostname="$(hostname)"

ls -ltr /var/log/console.* | awk -F 'log/' '{print $2}' | xargs - 
l1 -- sh -c 'aws s3 cp /var/log/"$1" s3://test- 
bucket/dom0/$hostname/' --

输出

upload: ../var/log/console.68.log to s3://test- 
bucket/dom0//console.68.log

请观察dom0//,应该在上面

预期的

dom0/host-123/console.68.log

1
$hostname 是否已定义?或者您想要使用 hostname 命令的输出? - nbari
我对xargs很陌生。请问您的建议,整个表达式会是什么样子?请给出精确的答案。 - user10724620
1
hostname不是一个环境变量,它只是一个变量。如果你想让它成为你子shell的环境变量(比如通过sh -c由xargs调用的shell),你应该将它导出。换句话说,应该使用命令export hostname - William Pursell
2个回答

2
你可以安全、简便地将主机名作为位置参数传递,就像传递文件名参数一样:

你可以将主机名作为位置参数传递,这样做既安全又方便,和传递文件名参数的方式相同:

最初的回答

hostname="$(hostname)"

ls -ltr /var/log/console.* | awk -F 'log/' '{print $2}' | xargs - 
l1 -- sh -c 'aws s3 cp "/var/log/$2" "s3://test-bucket/dom0/$1/"' -- "$hostname"

这样做可以避免将变量或文件名脆弱地注入到shell字符串中。翻译后的内容为:

这种方法消除了将变量或文件名脆弱地注入到shell字符串中的问题。


@fmaabd,您的原始命令是通过xargs运行sh -c 'echo 1 is $1' -- myfilename来工作的,其中在--之后的参数成为了shell字符串内的$1。我只是添加了一个额外的参数,以便$1是主机名,$2是文件名。 - that other guy
我认为我需要更多的了解: 因为我的下面代码无法完成单个文件传输。ls $hostname-var-log.tar.tgz | awk -F '/' '{print $1}' | xargs -l1 -- sh -c 'aws s3 cp $1 s3://test-bucket/dom0/$1/' -- "$hostname"我得到以下错误:用户提供的路径np-sjc2-dgx-050不存在。 xargs: sh:退出状态255;中止 - user10724620
在当前答案的状态下,$hostname 似乎被传递为 $1,但是 /var/log/$2 中的 $2 指的是什么? - vulcan raven
@vulcanraven 每个输入传递给xargs - that other guy
谢谢。所以这个 <command> | xargs sh -c 'echo "hostname: $1, xarg-input: $2"' -- "$hostname"<command> | xargs -I{} sh -c 'echo "hostname: $1, xarg-input: $2"' -- "$hostname" {} 的简写。我一直使用后者,显式形式。 :) - vulcan raven

0

我在写脚本时遇到了类似的问题。根据this answer,我尝试在子shell中导出我需要的变量,这对我起作用了。注意:我使用的是bash而不是sh来运行我的xargs子shell,所以结果可能会有所不同。

因此,针对您的情况,请尝试:

export hostname_="$(hostname)"

ls -ltr /var/log/console.* | awk -F 'log/' '{print $2}' | xargs - 
l1 -- sh -c "aws s3 cp /var/log/$1 s3://test-bucket/dom0/${hostname_}/" --

我在变量末尾添加了一个下划线来区分您的变量和命令。您可能可以省略hostname_周围的括号。我还尝试简化您的子shell命令的引用,但我不确定是否有效。您需要进行测试。

一个问题需要足够完整,使得某人不需要跟随链接就能使用它。为了利用[meta.se]上的类比,在[When is an answer not an answer?](https://meta.stackexchange.com/questions/225370/你的答案在另一个城堡里-什么时候才算是答案)中,告诉别人他们可以在哪里买到苹果的标志并不是苹果;同样,指向答案的链接本身并不是答案。也许添加演示? - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接