bash - 在 bash 中使用变量进行重定向
问题描述
我正在编写一个具有以下内容的基本脚本:
LOG_COMMAND=">/tmp/something.log 2>&1"
if [ "${VERBOSE}" == "y" ]; then
LOG_COMMAND="2>&1 | tee /tmp/something.log"
fi
问题是当我LOG_COMMAND
在脚本中使用变量时,它会被单引号包裹起来。例如:
set -v
docker build -t test:test . ${LOG_COMMAND}
set +v
我得到以下输出:
$ /bin/bash testing.sh -v
+ docker build -t test:test . '2>&1' '|' tee /tmp/something.log
"docker build" requires exactly 1 argument.
See 'docker build --help'.
如何防止包含单引号?
解决方案
简单而健壮的解决方案是将要重用的代码放在函数中,而不是变量中:
log() {
if [ "$VERBOSE" = "y" ]
then
"$@" 2>&1 | tee -a /tmp/something.log
else
"$@" >> /tmp/something.log 2>&1
fi
}
log docker build -t test:test .
您看到的单引号并没有以任何方式添加,它们只是 bash 的符号,向您显示该值是一个文字字符串,而不是命令语法的一部分。“删除”它们不会改变它们只是未解释的字符串的事实,而不whoami() { echo root; }
会使您成为超级用户。
如果它有助于将事物置于上下文中,那么 Java 具有相同的“问题”和相同的首选解决方案:
// Works
System.out.println("hello world".replaceAll("hello", "goodbye"));
// Fails
String replacer = ".replaceAll(\"hello\", \"goodbye\")";
System.out.println("hello world" + replacer);
推荐阅读
- assembly - 如何在文本模式程序集中换行
- raspberry-pi3 - raspberry pi 3 + windows 10 iot changing password makes device inacessible
- java - Reinitialize spring @Autowire bean
- c# - System.FormatException 错误并在尝试修复它时遇到问题
- javascript - 仅在解决循环内的多次提取后如何在 React 中设置状态
- jquery - jQuery- Changing Opacity with mouseenter and leave. Image still appears once hide button is clicked
- reactjs - create-react-app .env: process not defined
- javascript - JavaScript output not iterating correctly
- python - 深度 Q 学习修改
- internet-explorer - How to use bluebird promises only if browser doesn't support them natively