2つのスクリプトがあるとしましょう。
スクリプト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
Script2.sh:
#!/bin/bash echo "log to my log file from script 2" >> $HOME/log-file-version-?.?.log
私は走るscript1.sh
。
家に残ったログファイルは2つだけです。
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
効果はありません。
なぜそんなことですか?この問題をどのように解決できますか?
シェルスクリプトからシェルスクリプトにパラメータを渡したくないので、パラメータがそれ自体で十分であるため、ワイルドカードを使用する必要があります。
私はUbuntuを使用しており、デフォルトの端末であるgnome-terminalでこのスクリプトを実行しています。
答え1
bashのマニュアルはこんな感じです。3.6 リダイレクト部分:
以下の説明で特に断りのない限り、リダイレクト演算子の後に続く単語は、中括弧拡張、チルダ拡張、パラメータ拡張、コマンド置換、算術拡張、引用符の削除、ファイル名拡張子そして噴射。 Bashは、2つ以上の単語に拡張された場合にエラーを報告します。
sh
これをしないでください:POSIXシェル仕様
リダイレクト演算子が"
<<
"または"<<-
"の場合[...]。他のリダイレクト演算子の場合リダイレクト演算子の後に続く単語には、チルダ拡張、パラメータ拡張、コマンド置換、算術拡張、および引用符の削除が必要です。非対話型シェルは単語のパス名拡張を実行しないでください。対話型シェルはこれを実行できますが、拡張結果が単語の場合にのみこれを実行する必要があります。
$ dash
$ echo foo > *
$ ls
'*' README.md ...
$ bash
$ echo bar >> *
bash: *: ambiguous redirect