Drupalのdrushコマンドラインインタフェース出力からbashコマンドを実行したいと思います。drush site-alias
まず、グループ名を表示してから、グループ内の各サイトを表示するWebルートのリストを返します。ウェブサイト自体はエイリアスになっていますgroup.site
。たとえば、次のような結果が得られます。
内部内部。サイト1内部。サイト2外部外部。サイト1外部。サイト2マーケティングマーケティング。サイト1マーケティング。サイト2
グループエイリアス自体ではなく、各サイトエイリアスでコマンドを実行したいと思います。文字列にピリオドがあるかどうかをテストする必要があります。そうである場合は、次のようにします。
for i in $(drush site-alias); do {if no period) drush $i command; done;
このテストをどのように実行できますか?
答え1
パターンマッチングを使用できます。
for i in $(drush site-alias) ; do
if [[ $i == *.* ]] ; then
drush "$i" command
fi
done
答え2
$i
POSIXに似たシェルの場合は、次の場合にコマンドを実行するとします。いいえ例に示すように、ピリオドを含む次のように書くことができます。
case $i in
(*.*) ;; # contains "."s, do nothing
(*) drush "$i" command;;
esac
引用符$(drush site-alias)
がない場合は、分割+globが実行されます。必要な分割は$IFS
基本的に文字(スペース、タブ、および改行(zshのNULを含む))で行われますが、不要なワイルドカードは単語/*
を/
。
GNUシステムでGNUシェルのようなKshスタイルのプロセス置換をサポートするシェルを使用すると、コマンド出力は次のようになります。サイトエイリアス各行に対して次のことができます。
xargs -rd '\n' -a <(drush site-alias | grep -vF .) -I@ drush @ command
これにはいくつかの利点があります。
- ワイルドカードなし
- 何が
$IFS
あっても改行文字と改行文字だけで正しく分割されます。 - 出力全体をメモリに保存しないで、コンテンツ出力が開始されるとすぐに
drush
コマンドを実行します。drush site-alias
- いずれかが失敗すると、その失敗はの終了状態
drush command
に反映されます。xargs
すべての失敗はdrush site-alias
まだ無視されます。
これにより、zsh
次のことができます。
autoload zargs
site_aliases=( ${(f)"$(drush site-alias)"} ) || exit
zargs -I@ -- ${site_aliases:#*.*} -- drush @ command
どこ:
- また、
f
パラメータ拡張フラグを使用して改行でのみ分割します(空の行は削除されます)。 - 失敗を処理します
drush site-alias
(ここでは終了スクリプトを介して)。 ${site_aliases:#*.*}
フィルター出るM
(フィルタにパラメータ拡張フラグを追加する存在する代わりに)要素が含まれています。.
- 同様に、コマンドが失敗する
xargs
とzargs
失敗した終了ステータスが返されます。
答え3
パターン交換拡張機能を使用してこれを行うことができます。
for i in $(drush site-alias); do
if [ -z "${i//[^.]/}" ]; then
# no period
drush "$i" command
fi
done
はい、引用しました"$i"
。これはおそらく可能であれば何をすべきかです。そうすれば驚きを避けることができるでしょう。この場合は問題ではありません。
答え4
別の独立した回答には、次を使用することをお勧めします。シェルパラメータ拡張。
for i in $(drush site-alias)
do
if [[ ${i%.*} == $i ]]
then
drush $i command
fi
done