![当命令存储在变量中时,io 重定向不起作用](https://linux22.com/image/11574/%E5%BD%93%E5%91%BD%E4%BB%A4%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E6%97%B6%EF%BC%8Cio%20%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
以下命令可让我检查网页是否具有特定内容。除非找到内容,否则它不会输出任何内容。
curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'
问题是,当我将其添加到 shell 脚本中时,输出不再被抑制。
#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
$TEST1
if [[ $? != 0 ]]; then
#do something if exit status of last command not equal to zero
fi
如果我尝试将脚本的输出存储在变量 ( VAL1
)中,我也会遇到同样的问题
#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
VAL1+=$($TEST1)
echo "result should be blank or the found grep $VAL1"
为什么2>&1
直接运行命令时可以按预期工作,但添加到脚本时输出将直接在命令行中?
更新
杰夫斯在评论中的暗示让我朝着正确的方向前进。接受的答案是正确的。我为脚本所做的工作是将我最初尝试分配给变量的代码移动到函数中并使用$( ... )
.这样一切都按预期运行:
#!/bin/bash
# note that -z checks if variable is empty
test1() {
VAL1=$(curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content')
if [[ -z $VAL1 ]]; then
VAL1=test1fail
fi
}
test1
echo $VAL1
答案1
杰夫·夏勒的评论关联是在鼻子上。 bash 手册中的关键信息(https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion)
当执行一个简单的命令时,shell 从左到右执行以下扩展、赋值和重定向。
步骤 1 识别重定向并保存它们。
第 2 步是变量扩展发生的地方。
shell 在步骤 1 中看不到重定向。
答案2
糟糕的解决方案是强制进行双重评估:
eval "$TEST1"
好的解决方案是按语义分割命令(url,内容):
curl -v --silent "$url" |& grep "$content"
注意:|&
是语法糖2>&1 |