与输出重定向一起使用时,shell 脚本不解释通配符

与输出重定向一起使用时,shell 脚本不解释通配符

假设我有两个脚本:

  • 脚本1.sh:

    #!/bin/bash
    version=2.6
    log_file="$HOME/log-file-version-$version.log"
    
    touch $log_file &>/dev/null
    
    echo "log to my log file from script 1" >> $HOME/log-file-version-?.?.log
    
    gnome-terminal --tab --active --title="script2" --  sh script2.sh
    
  • 脚本2.sh:

    #!/bin/bash
    
    echo "log to my log file from script 2" >> $HOME/log-file-version-?.?.log
    

我跑script1.sh

我家里只剩下两个日志文件:

log-file-version-2.6.log
log-file-version-?.?.log

log-file-version-2.6.log包含:

从脚本 1 记录到我的日志文件

log-file-version-?.?.log包含:

从脚本 2 记录到我的日志文件

这意味着在脚本 1 中,第 7 行 ( >> $HOME/log-file-version-?.?.log) 中的通配符已正确解释,但是当使用这些通配符运行脚本时,sh这些通配符不起作用。

这是为什么?我该如何解决这个问题?

我需要使用通配符,因为我不想将参数从 shell 脚本传递到 shell 脚本,并且我希望它们能够自给自足。

我正在使用 Ubuntu 并从默认终端 gnome-terminal 运行这些脚本。

答案1

bash 手册中有这样的说法3.6 重定向部分:

在下面的描述中,除非另有说明,重定向运算符后面的单词都经过大括号扩展、波形符扩展、参数扩展、命令替换、算术扩展、引号删除、文件名扩展和分词。如果它扩展到多个单词,Bash 会报告错误。

sh不这样做:从POSIX shell 规范

如果重定向运算符是“ <<”或“ <<-”,则[...]。对于其他重定向运算符,重定向运算符后面的单词应进行波形符扩展、参数扩展、命令替换、算术扩展和引号删除。非交互式 shell 不得对单词执行路径名扩展;交互式 shell 可以执行此操作,但只有当扩展结果为一个单词时才应执行此操作。

$ dash
$ echo foo > *
$ ls
'*'  README.md  ...
$ bash
$ echo bar >> *
bash: *: ambiguous redirect

相关内容