ฉันจะตั้งค่าตัวแปรสภาพแวดล้อมสำหรับคำสั่งเดียวในเชลล์หอยได้อย่างไร


49

EDITOR=vim crontab -eในทุบตีฉันจะทำ ฉันจะได้รับผลกระทบที่คล้ายกันในเปลือกหอยปลา

คำตอบ:


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

2
มีวิธีใดง่ายกว่าในการทำเช่นนี้?
Milovan Zogovic

นี่มันใช้ไม่ได้สำหรับฉัน ฉันกำลังเรียกสคริปต์ ruby ​​และ ENV จะไม่เก็บค่าตัวแปรที่ฉันตั้งไว้:set -lx date '12/04/2012'
Duke

@Duke: มันเหมาะกับฉัน begin; set -lx date '12/04/2012'; ruby -e 'puts ENV["date"]'; end
Dennis Williamson

10
ในระหว่างนี้สิ่งนี้ได้รับการตอบในคำถามที่พบบ่อยเกี่ยวกับปลา: fishshell.com/docs/current/faq.html#faq-single-env
อันตรายต่อ

2
และสิ่งที่คำถามที่พบบ่อยกล่าวคือ:env SOME_VAR=1 command
BallpointBen

72

ไม่เห็นสาเหตุที่สิ่งนี้ไม่ทำงาน: env EDITOR=vim crontab -e
ที่ผ่านเชลล์อย่างสมบูรณ์


3
มันง่ายกว่ามาก ปัญหาเดียวก็คือว่าการข้ามเชลล์ไม่อนุญาตคำสั่งปลาที่กำหนดเองซึ่งอาจถูกล็อคในหน่วยความจำกล้ามเนื้อของคุณ
JohnMetta

ฉันเห็นสิ่งนั้นในเอกสารด้วย แต่เหตุใดจึงไม่ทำงานต่อไปนี้ env SOME_VAR=1 echo $SOME_VAR
lmsurprenant

ไม่เป็นไรฉันควรจะลองดูมัน: stackoverflow.com/questions/10938483/ …
lmsurprenant

10

นั่นคือจากเอกสาร

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

ใช้คำสั่ง env

env SOME_VAR=1 command

นอกจากนี้คุณยังสามารถประกาศตัวแปรท้องถิ่นในบล็อกและที่จะไม่ข้ามเปลือก

begin
  set -lx SOME_VAR 1
  command
end

2

ขึ้นอยู่กับคำจำกัดความของbeฟังก์ชันสิ่งนี้อาจล้มเหลว

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

เพื่อให้มันทำงาน:

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

โปรดดูคำอธิบายของ- ไม่มีตัวเลือกขอบเขตการแชโดว์

-S หรือ - no-scope-shadowing ช่วยให้ฟังก์ชั่นการเข้าถึงตัวแปรของฟังก์ชั่นการโทร โดยปกติแล้วตัวแปรใด ๆ ภายในฟังก์ชั่นที่มีชื่อเดียวกับตัวแปรจากฟังก์ชั่นการโทรคือ "แชโดว์" และเนื้อหาของพวกเขาเป็นอิสระจากฟังก์ชั่นการโทร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.