Bagaimana saya bisa mengatur variabel lingkungan untuk hanya satu perintah di shell ikan?

49

Dalam bash, aku bisa melakukannya EDITOR=vim crontab -e. Bisakah saya mendapatkan efek serupa di kulit ikan?

skalee
sumber

Jawaban:

27
begin; set -lx EDITOR vim; crontab -e; end
Dennis Williamson
sumber
2
adakah cara yang lebih mudah untuk melakukan ini?
Milovan Zogovic
anehnya, ini tidak berhasil untuk saya. Saya menelepon skrip ruby, dan ENV tidak mengambil variabel yang saya setting:set -lx date '12/04/2012'
Duke
@ Duke: Ini bekerja untuk saya. begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
Dennis Williamson
10
Sementara itu, ini telah dijawab dalam FAQ Ikan: fishshell.com/docs/current/faq.html#faq-single-env
harm.
2
Dan apa yang dikatakan oleh FAQ adalah ini:env SOME_VAR=1 command
BallpointBen
72

Jangan melihat mengapa ini tidak berhasil: env EDITOR=vim crontab -e
Itu memotong shell sepenuhnya.

Wayne
sumber
3
Ini jauh lebih mudah. Satu-satunya masalah adalah bahwa melewati shell melarang perintah ikan kustom, yang mungkin terkunci dalam memori otot Anda.
JohnMetta
Saya melihat itu di dokumen juga, tapi mengapa tidak berhasil? env SOME_VAR=1 echo $SOME_VAR
Pendekar
tidak apa-apa, saya seharusnya mencarinya: stackoverflow.com/questions/10938483/…
lmsurprenant
10

Itu dari Dokumentasi

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

Gunakan perintah env.

env SOME_VAR=1 command

Anda juga bisa mendeklarasikan variabel lokal di blok dan itu tidak akan melewati shell

begin
  set -lx SOME_VAR 1
  command
end
Azd325
sumber
2

tergantung pada definisi befungsi, ini bisa gagal

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

Agar itu berfungsi:

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

Silakan, lihat penjelasan opsi --no-scope-shadowing

-S atau --no-scope-shadowing memungkinkan fungsi untuk mengakses variabel fungsi panggilan. Biasanya, setiap variabel di dalam fungsi yang memiliki nama yang sama dengan variabel dari fungsi panggilan "dibayangi", dan isinya tidak tergantung pada fungsi panggilan.

Vadym Tyemirov
sumber