私は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