私は現在のBashセッションでBashスクリプトファイルのコレクションを実行するために、次の方法を使用します。
source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}
メンテナンスが不便すぎると思います。いくつかの垂直コレクションがより良いです。擬似コード:
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
これを垂直方向にどうしますか?
ところで、ここにあるソース文書が次のようなものかどうかは分かりません。これ最良の方法です。
修正する
source
Bash 4.3.48(1) 以降、Bash インタプリタは 1 つsource
のファイルしか処理できない方法で評価し、それ以外のすべての操作は引数として評価されるため、1 行の操作が失敗する運命であることを理解しています。最初のファイル(中括弧セットは{}
役に立ちません)。
bash
私の感想はその逆と同じだということだsource
。
答え1
Heredocは、他の何もせずに各ファイル名を独自の行に配置し(ファイル名に改行文字などのクレイジーな内容が含まれていないと仮定)、ファイル名の特定の順序を許可します。
while read f; do
source ~/myScripts/"$f"
done <<SRC_LIST
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
so_forth.sh
SRC_LIST
source file [arguments]
これにより、後続のファイル名が引数として扱われる問題も回避されますassignments.sh
(実際には、後続のファイル名を引数として意味しない限り??)。このリストはファイルシステムのエントリと手動で同期する必要があります。
別のオプションは、ファイルを一覧表示する退屈をスキップしてそれをglobに入れることです。これは、ディレクトリ内の一致するすべてのファイルがソースになる可能性があり、ソースにする必要があると仮定します(ソースをインポートしてはならない*.sh
他の任意のファイルは混在しません)。ただし、globに一致するファイルがないと、この状況は複雑になります。この場合、ソースをインポートするためにデフォルトでbash
リテラルファイル名が渡されるため、~/myScripts/*.sh
この問題を解決する必要があります(必要に応じて一時的に)。ソースがなければ、一致しないソースは得られません。
REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
source "$f"
done
$REVERT
この方法では、ファイルの順序を取得する必要がある場合は、globが正しい順序でファイル名と一致するようにファイル名を指定する必要があります。 (ZSHでは空のglobshopt
しか実行されないため、呼び出しは必要ありませんfor f in ~/myScripts/*.sh(N); do
。他のシェルは、globの処理方法と一致するものがない場合に実行する操作が異なります。)