bash スクリプトから fish のコマンドを実行しますか?

bash スクリプトから fish のコマンドを実行しますか?

サーバー クラスターをセットアップするための、かなり長い bash スクリプトがあります。fish インタープリターへの切り替えを開始したいのですが、段階的に実行したいと思います。bash スクリプトをそのままにして、fishfish プロンプトに切り替えるコマンドを追加し、スクリプトであっても、bash スクリプトの残りの部分で fish インタープリターからの残りのコマンドを実行することはできますか#!/bin/bash?

答え1

これができるかもしれないと考えている場合:

#!/bin/bash
echo this part is bash commands
for num in {1..10}; do echo $(( num*num )); done
fish
echo this part is fish commands
for num in (seq 10); math $num \* $num; end

いいえ、そのようには動作しません。スクリプトの途中で対話型の fish セッションが開始され、その fish プロセスを終了すると、bash は残りのコマンドを bash コマンドとして実行しようとします。構文エラー メッセージがはっきりと表示されます。

を実行する必要がありますfish -c 'fish commands ...'が、これは簡単に引用符地獄につながる可能性があります。bash スクリプトで言語を混在させる最も安全な方法は、引用符で囲まれたヒアドキュメントを使用することです。環境を使用して、fish 部分の bash 変数を公開できます。

#!/bin/bash
echo this part is bash commands
for num in {1..10}; do echo $(( num*num )); done
export foo=bar
fish <<'END_FISH'
    echo this part is fish commands
    for num in (seq 10); math $num \* $num; end
    echo the bash variable foo has value $foo
END_FISH

関連情報