Wie kann ich Umgebungsvariablen für nur einen Befehl in der Fischschale festlegen?


49

In Bash kann ich tun EDITOR=vim crontab -e. Kann ich in Fish Shell einen ähnlichen Effekt erzielen?

Antworten:


27
begin; set -lx EDITOR vim; crontab -e; end

2
Gibt es einen einfacheren Weg, dies zu tun?
Milovan Zogovic

Seltsamerweise funktioniert das bei mir nicht. Ich rufe ein Ruby-Skript auf und ENV nimmt die Variable, die ich einstelle, nicht auf:set -lx date '12/04/2012'
Duke

@Duke: Es funktioniert bei mir. begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
Dennis Williamson

10
In der Zwischenzeit wurde dies in den Fisch- FAQs
harm

2
Und was diese FAQ sagt, ist dies:env SOME_VAR=1 command
BallpointBen

72

Verstehe nicht, warum das nicht funktionieren sollte: env EDITOR=vim crontab -e
Das umgeht die Shell komplett.


3
Das ist so viel einfacher. Das einzige Problem ist, dass das Umgehen der Shell keine benutzerdefinierten Fischbefehle zulässt, die wahrscheinlich in Ihrem Muskelgedächtnis gespeichert sind.
JohnMetta

Ich habe das auch in den Dokumenten gesehen, aber warum funktioniert dann das Folgende nicht? env SOME_VAR=1 echo $SOME_VAR
lmsurprenant


10

Das ist aus der Dokumentation

SOME_VAR=1 command produces an error: Unknown command "SOME_VAR=1".

Verwenden Sie den Befehl env.

env SOME_VAR=1 command

Sie können auch eine lokale Variable in einem Block deklarieren, die die Shell nicht umgeht

begin
  set -lx SOME_VAR 1
  command
end

2

beDies kann je nach Funktionsdefinition fehlschlagen

begin
  set -lx RAILS_ENV staging
  be rails r "p ENV['RAILS_ENV']"
end

Damit es funktioniert:

function be --description 'Runs bundle exec' --no-scope-shadowing
  bundle exec $argv
end

Weitere Informationen finden Sie in der Erläuterung der Option --no-scope-shadowing

-S oder --no-scope-shadowing ermöglicht der Funktion den Zugriff auf die Variablen aufrufender Funktionen. Normalerweise sind alle Variablen in der Funktion, die denselben Namen wie Variablen aus der aufrufenden Funktion haben, "schattiert" und ihr Inhalt ist unabhängig von der aufrufenden Funktion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.