グローバルファイル名にリダイレクトできませんでした。

グローバルファイル名にリダイレクトできませんでした。

私はUbuntu 16.04(xenial)でBash 4.3.48(1)とLEMPスタックを使用しています。

php.iniバージョンに依存しない方法で使用しようとしていますprintf

1)バージョンに依存しない操作が失敗しました。

printf "[PHP]\n post_max_size = 200M\n upload_max_filesize = 200M\n cgi.fix_pathinfo = 0" > /etc/php/*/fpm/zz_overrides.ini

次のエラーが発生します。

bash: /etc/php/*/zz_overrides.ini: そのファイルやディレクトリはありません。

2)バージョン 永続的な操作が成功しました。

printf "[PHP]\n post_max_size = 200M\n upload_max_filesize = 200M\n cgi.fix_pathinfo = 0" > /etc/php/7.0/fpm/zz_overrides.ini

*ご覧のとおり、両方とも基本的に7.0対。対。

  • .NETでこの(正規表現?)問題の手がかりが見つかりませんでしたman printf
  • Googleで検索しましたが、「printfで正規表現を許可する」の内容が見つかりませんでした。

バージョンに依存しない操作が失敗してバイパスするのはなぜですか?

編集:私にとって最も重要なことは、可能であれば1行の操作を使用することです。

ベストアンサー1

リダイレクトのパターンマッチング動作はシェルごとに異なるようです。私のシステムでは、dashとksh93はパターンを拡張しないので、リテラルfilenameを取得します*。 Bashはそれを拡張します(1)。ただし、パターンがファイルと一致する場合にのみ適用されます。一致するファイル名がさらにある場合、エラーが発生します。 Zshは複数のリダイレクトを提供するように動作し、出力を次にリダイレクトします。みんなファイルを一致させます。

(1) 非対話型およびPOSIXモードの場合を除く

一致するすべてのファイルを出力するには、次のものを使用できますtee

echo ... | tee /path/*/file > /dev/null

1つのファイルにのみアクセスするには、どのファイルを使用するかを決定することが問題です。 1つのファイルのみがパターンに一致することを確認するには、リスト全体を展開して数を数えます。

Bash/kshから:

names=(/path/*/file)
if [ "${#names[@]}" -gt 1 ] ; then
    echo "there's more than one"
else
    echo "there's only one: ${names[0]}"
fi

標準シェルでは、set位置パラメータが計算に使用されます$#


もちろん、パターンがどんなファイルとも一致しなければそのまま残り、globが途中にあるので結果は存在しないディレクトリを指す。これは、存在する前に作成しようとするのと/path/to/file同じです/path/to。ここでは/path/*代わりにアスタリスクを使用します。

この問題を解決するには、ファイル名なしでディレクトリ名を拡張し、すべてのディレクトリにファイル名を追加する必要があります。これは少し悪いです...

dirs=(/path/*)
files=( "${dirs[@]/%/\/file}" )

その後、この配列を使用できます。

echo ... | tee "${files[@]}" > /dev/null

あるいは、簡単なアプローチをとり、ファイル名パターンを繰り返すこともできます。より一般的な場合は、出力ファイルごとに基本コマンドを一度実行するか、一時ファイルを使用して出力を保存する必要があるため、これはやや満足できません。

for dir in /path/* ; do
    echo ... > "$dir/file"
done 

おすすめ記事