Ich habe ein ziemlich langes Bash-Skript zum Einrichten eines Serverclusters. Ich möchte mit der Umstellung auf den Fish-Interpreter beginnen, dies jedoch schrittweise tun. Kann ich mein Bash-Skript so lassen, wie es ist, und den fish
Befehl zum Umschalten auf die Fish-Eingabeaufforderung hinzufügen, und der Rest des Bash-Skripts führt die restlichen Befehle des Fish-Interpreters aus, obwohl es sich um ein #!/bin/bash
Skript handelt?
Antwort1
Wenn Sie meinen, dass Sie dies vielleicht schaffen könnten:
#!/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
dann nein, so funktioniert es nicht. Das würde eine interaktive Fish-Sitzung mitten im Skript starten, und wenn Sie diesen Fish-Prozess beenden, würde Bash versuchen, die restlichen Befehle als Bash-Befehle auszuführen. Sie würden deutlich Syntaxfehlermeldungen sehen.
Sie müssten dies tun fish -c 'fish commands ...'
, aber das kann leicht zu einer Hölle mit Anführungszeichen führen. Der sicherste Weg, Sprachen in einem Bash-Skript zu mischen, ist die Verwendung eines zitierten Heredocs. Sie können Bash-Variablen für den Fish-Teil freigeben, indem Sie die Umgebung verwenden.
#!/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