シェルスクリプトは、出力リダイレクトで使用するとワイルドカード文字を解釈しません。

シェルスクリプトは、出力リダイレクトで使用するとワイルドカード文字を解釈しません。

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

関連情報