web-dev-qa-db-ja.com

バックティックを使用せずにコマンドラインプロンプト(PS1)でコードを実行する方法はありますか?

このコードをコマンドプロンプト(PS1)で直接使用していますが、前のコマンドが正しく実行されたかどうかがわかります。

_PS1="\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[???? ]\"\e[0m; fi\`-[\u@\h: \w]"
_

バックティック表記は好きではありません。 ``を使わずに実行する方法はありますか?

また、これが別のスクリプトの結果に干渉する理由はありますか?コマンドプロンプトで呼び出した関数を公開しましたが、この部分は結果を台無しにします。この関数は、PS1がエクスポートされるときに一度だけ呼び出され、コマンドプロンプトがロードされるたびに呼び出されるわけではありません。

更新1:プレーンな「$()」を試しましたが、機能しませんでした。そして、バックスラッシュを追加すると「\ $()」が機能するので、私はもっと困惑しています。どうしてこれなの?誰かこれを知っていますか? 「$」はエスケープする必要がありますか?

オリジナル作品:

_export PS1="[\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[???? ]\"\e[0m; fi\`]-[\u@\h: \w] \$ "
_

結果:

_[⚡️ ]-[rordev@Luiss-MBP: ~/Development/test] $
_

これは機能しません:

_export PS1="[$(if [ $? = 0 ]; then echo -e \e[1;32m[⚡️ ]\e[0m; else echo -e \e[1;31m[???? ]\e[0m; fi)]-[\u@\h: \w] \$ "
_

結果:

_-bash: 32m[⚡️: command not found
[e[1]-[rordev@Luiss-MBP: ~/Development/test] $
_

しかし、これは機能します。どうして?そして、なぜbefore$()にバックスラッシュが必要なのですか?

_export PS1="\$(if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[???? ]\"\e[0m; fi)-[\u@\h: \w] \$ "
_

結果:

_[⚡️ ]-[rordev@Luiss-MBP: ~/Development/test] $ 
_

更新2:提案を試しましたが、機能します。まあ、ちょっと。

最初に条件を呼び出し、最後に関数を呼び出さなければなりません。

_PS1="\$(if [ \$? = 0]; then ...; else ...; fi)-[\u@\h: \w\$(myFunction)]"
_

しかし、それは他の方法では機能しません。

_PS1="[\u@\h: \w\$(myFunction)]-\$(if [ \$? = 0]; then ...; else ...; fi)"
_

関数が呼び出されて結果が表示されますが、条件が実行されていないようです。または、返されるステータスコードが常に0であるように見えます。したがって、条件の最初の部分が常に表示されます。

それについて何かアイデアはありますか?コマンド置換が実行される順序と関係があるのではないかと思います。

4
luis.madrigal

:私はあなたの質問にコメントする評判がないので、あなたの注意を引くためだけにこの回答を使用しています。

以前の回答を編集して、最後の更新に役立てました。
$ Prompt_COMMANDを使用してプロンプトのロジックを処理しようとしましたか?論理とは、条件文と想定される関数呼び出しを意味します。

また、終了ステータスとして常に0になる理由のコメントも追加しました。この問題を回避するには、保存する必要があります。

これがお役に立てば幸いです。