Bash 脚本重定向不起作用,为什么?

标签 bash

<分区>

我最近在 bash 脚本中发现了一个意外行为,我想在解决它之前了解它。这是一个简化的示例:

#! /bin/sh
SCRIPT="/tmp/echoscript.sh >> /tmp/log"
/bin/sh ${SCRIPT}

echoscript.sh 只是“回显“abc””

出乎意料的是,'abc' 进入终端而不是/tmp/log 文件。这是为什么?

如果我把第三行改成:

/bin/sh ${SCRIPT} >> /tmp/log

然后我得到了预期的结果; 'abc' 进入日志文件。

最佳答案

你不能像这样在变量中放置重定向。当你做 Bash 解释 /bin/sh ${SCRIPT} 就像你写的一样:

/bin/sh "/tmp/echoscript.sh" ">>" "/tmp/log"

注意 ">>" 是如何被引用的,从而终止了尝试的重定向。发生这种情况是因为 Bash 分阶段解析命令,并且解析重定向发生在变量扩展之前。不检查重定向的变量值。

关于Bash 脚本重定向不起作用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20622128/

相关文章:

linux - 接受搜索字符串的脚本,搜索包含该字符串的文件夹并将它们移动到与该字符串同名的文件夹中

Bash 进程替换 : what does `echo >(ls)` do?

linux - .txt文件搜索并输出

java - 使用 bash 文件时如何从 java 中的控制台获取参数?

Java:如何在特定目录中运行Java进程?

windows - bash:在 MobaXterm 中运行 gradle 时找不到小程序

linux - 比较两个 csv 文件并根据使用 awk 的比较更新字段

linux - 在打印特定菜单的 shell 脚本中需要帮助

bash - "for"循环通配符评估为变量,如果不存在此类文件

linux - 将文件组移动到子目录中