假设我有两个脚本:
脚本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