
私ファイルの生成その中でもBash完了スクリプトのインストール:
install [...] /etc/bash_completion.d/
これはUbuntuではうまく機能しますが、Arch Bashでは完成機能があります/usr/share/bash-completion/completions
。
それは何ですか?一般的なGNUまたはPOSIXmake
方式これを処理しようとしている?次の機能を備えた良いソリューションが欲しいです。
- コマンドが失敗した場合、
install
ターゲットも失敗するはずです。 - 作成された順序でディレクトリのリストに移動します。最初の既存のディレクトリ(存在する場合):
- ファイルがない場合はインストールしてください。
- ファイルが存在し、最新でない場合(
make
意味論に従って)、ファイルを上書きします。 - ファイルが存在し、最新の場合はファイルをスキップします。
- ディレクトリの処理を停止します。
- これはいいえファイルがどこにもインストールされていない場合は、エラーが表示されます。
これはいいえ
Makefile
ファイルがすでに1つのディレクトリにインストールされており、後続の実行でそのファイルを別のディレクトリにインストールすると、エラーが発生します(この場合も処理しないでください)。つまり、ディレクトリのリストが与えられた/a /b
場合- 作る
/b
, - ファイルをに入れ
/b
、 - その後
/a
、 - 走る
make
Makefile
しなければならないいいえ/b
すべての存在が検出されました。- 作る
- これはいいえディレクトリがないとエラーが発生します。
- どのディレクトリを試したかについてのフィードバックがあれば良いですが、必須ではありません。
答え1
確かなスクリプトソリューションは次のとおりです。
for dir in /etc/bash_completion.d /usr/share/bash-completion/completions; \
do \
if [ -d "$$dir" ]; \
then \
install [...] "$$dir" || exit 1; \
break; \
fi; \
done
しかし、これは良くありません。
- 多くのエスケープ文字
|| exit 1
エラーを確認するには、醜いツールを使用する必要があります
そして、ファイルが最新であることを確認しません(ポイント2.2、2.3)。
答え2
簡単な方法は、各インストールを順番に試して、そのうちの1つが成功するまで続行することです。
for d in /etc/bash_completion.d /usr/share/bash-completion/completions; do \
{ cmp -s $(COMPLETION_SCRIPT) $$d/$(COMPLETION_SCRIPT) || \
install $(INSTALL_OPTIONS) $(COMPLETION_SCRIPT) $$d; } && exit; \
done; \
exit 1