กลับมาจากการเลียนแบบ bash unsets zsh opts


3

ดังนั้นฉันจึงมีสคริปต์การตั้งค่าในที่ทำงานซึ่งใช้ได้กับเท่านั้นbash(เพราะใช้เช่น==หรือ$BASH_SOURCE)

มันทำงานเพื่อแหล่งสคริปต์เหล่านี้โดยใช้emulateคำสั่งของ zsh :

emulate bash
source setupscipt.bash
emulate zsh

แต่นี่รีเซ็ต zsh opts ของฉันเหมือน "autocd" (ตั้งค่าเป็น. zshrc)

ฉันจะเริ่มต้นและออกจากการจำลองทุบตีเพื่อให้ opts ของฉันอยู่ในนั้นได้อย่างไร

คำตอบ:


4

Zefram ตอบคำถามที่คล้ายกันในรายชื่อผู้รับจดหมาย zsh กว่า 20 ปีที่ผ่านมา :

การแก้ปัญหาคือการใช้ฟังก์ชั่น - เรียกมันว่าsource_bash- ไปยังแหล่งที่คุณสคริปต์ทุบตี:

function source_bash {
  emulate -L bash
  builtin source "$@"
}

เคล็ดลับคือตัวเลือกlocaloptions(ตั้งค่าโดย-Lพารามิเตอร์ของการโทรเลียนแบบ) ซึ่งอธิบายไว้ในหน้า man:

LOCAL_OPTIONSหากตั้งค่าตัวเลือกนี้ ณ จุดส่งคืนจากฟังก์ชันเชลล์ตัวเลือกส่วนใหญ่ (รวมถึงตัวเลือกนี้) ซึ่งมีผลบังคับใช้เมื่อเข้าสู่ฟังก์ชันจะถูกกู้คืน ตัวเลือกที่ไม่ได้รับการกู้คืนจะได้รับสิทธิ์และข้อ จำกัด มิฉะนั้นจะมีเพียงตัวเลือกนี้เท่านั้นและตัวเลือก LOCAL_LOOPS, XTRACE และ PRINT_EXIT_VALUE จะถูกกู้คืน ดังนั้นหากสิ่งนี้ไม่มีการตั้งค่าอย่างชัดเจนโดยฟังก์ชั่นเชลล์ตัวเลือกอื่น ๆ ที่มีผลบังคับใช้ ณ จุดส่งคืนจะยังคงเป็นเช่นนั้น ฟังก์ชั่นเชลล์ยังสามารถรับประกันตัวเองว่ารู้จักการกำหนดค่าเชลล์ด้วยสูตรเช่น `emulate -L zsh '; -L เปิดใช้งาน LOCAL_OPTIONS

นำฟังก์ชั่นนี้ไปใช้กับคุณ~/.zshrcและคุณจะต้องทำ

$ source_bash setupscipt.bash

เมื่อจำเป็น.


เคล็ดลับเด็ด ๆ แต่เพื่อให้มั่นใจว่า: ตัวแปรสภาพแวดล้อมที่ตั้งค่าใน setupscript จะถูกตั้งค่าใน parent zsh ด้วยหรือไม่
Jounathaen

2
@Jounathaen: ใช่ localoptionsตัวเลือกเดียวที่จะเรียกคืน zsh ตัวเลือก ; สภาพแวดล้อมไม่เปลี่ยนแปลง แต่โปรดลองถ้าการตั้งค่าของคุณตรงตามที่คุณต้องการ
mpy

1
ดังที่ได้กล่าวไว้ในบรรทัดสุดท้ายของการเสนอราคาของ man page เราสามารถใช้สั้นกว่าemulate -L bashแทนการsetopt localoptionsใช้บรรทัดของตัวเอง :)
ZeroKnight

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