แบ่งปันชื่อแทนและการตั้งค่าเส้นทางระหว่าง zsh และ bash


24

zshเปลือกที่ผมปกติใช้เป็น ฉันมีนามแฝงหลายสีเพื่อเปิดใช้งานในโปรแกรมบางอย่างเช่นและls grepฉันได้กำหนดเส้นทางที่กำหนดเองเพื่อให้ฉันสามารถเรียกใช้งานโปรแกรมในสถานที่ที่ไม่ได้มาตรฐาน (เช่นใน~/bin/)

ฉันจะไม่เปลี่ยนเปลือกรากไปzshแต่ฉันต้องการที่จะแบ่งปันการตั้งค่าเหล่านี้เพื่อให้รากที่สามารถมีได้เช่นกัน ผมพบว่าไม่ได้มีการจัดหาzsh /etc/profileฉันสามารถหามาได้/etc/zsh/zprofileแต่ฉันต้องการวิธีที่เหมาะสมกว่า

คำตอบ:


16

ฉันจะสร้างไฟล์/etc/commonprofileและแหล่งที่มามันทั้งในและ/etc/profile /etc/zsh/zprofileนี้จะช่วยให้คุณมีโอกาสที่จะตั้งค่าทั่วไปร่วมกันและยังคงใช้bashตามลำดับzshการตั้งค่าเฉพาะและไวยากรณ์ในตามลำดับ/etc/profilezprofile


คำตอบที่ดีในหมู่อื่น ๆ ผมคิดว่านี่เป็นหนึ่งในชุดผมที่ดีที่สุดที่ค่อนข้างง่ายและ "สะอาด"
phunehehe

คุณหมายถึงอะไรโดย "แหล่งที่มา"
Hlung

@Hlung สำหรับการโหลดเชลล์ความละเอียดสูงนี่คือ 'source /path/to/.shell_profile' มา ดูหน้าคนที่ 'แหล่งที่มา'
Itachi

17

Zsh มีโหมดความเข้ากันได้กับ sh ซึ่งจะช่วยให้สามารถรันโค้ด POSIX sh และส่วนขยายทุบตีบางส่วนได้ ตราบใดที่คุณไม่ได้ใช้คุณสมบัติทุบตีที่ zsh ไม่มี (ด้วยไวยากรณ์เดียวกัน) คุณสามารถมีไฟล์เดียวกันที่มาจากเชลล์ทั้งสอง ใช้ในemulateตัวเพื่อวาง zsh ในโหมดที่เข้ากันได้; ด้วย-Lตัวเลือกการจำลองเป็นแบบท้องถิ่นไปยังฟังก์ชั่นการปิดล้อม (ไม่ใช่สคริปต์ที่มาล้อมรอบ)

source_sh () {
  emulate -LR sh
  . "$@"
}

สำหรับสิ่งต่าง ๆ เช่นตัวแปรสภาพแวดล้อมคุณสามารถใช้source_sh /etc/profileใน/etc/zprofileและsource_sh ~/.profileใน~/.zprofileเนื่องจากไฟล์โปรไฟล์ไม่น่าจะใช้คุณสมบัติเฉพาะของ bash

สำหรับสิ่งต่างๆเช่นนามแฝงและคำจำกัดความของฟังก์ชั่นเนื่องจากไฟล์ shell rc มีแนวโน้มที่จะมีหลายสิ่งที่ไม่สามารถแชร์ได้ (พร้อมท์การเชื่อมโยงคีย์การตั้งค่าความสมบูรณ์ ... ) ให้ใช้ไฟล์~/.sh_aliasesที่มีที่มา~/.bashrcและsource_sh'd ใน~/.zshrc.


2
ควรมีวิธีการพูดว่า "โหวตโดยอัตโนมัติคำตอบทั้งหมดโดย Gilles" นี้จะช่วยฉันค่อนข้างบางครั้ง ไม่จริงคำตอบของคุณสั่นคลอน แม่นยำถูกต้องเขียนได้ดีและครอบคลุมเสมอ
fschmitt

@fschmitt: ฉันเห็นด้วย และคุณสามารถเห็นว่ามันไม่ได้ถูกแก้ไขแม้แต่! คำใบ้ที่ให้ไว้ที่นี่ดีจริงๆ
ใครบางคนยังคงใช้ MS-DOS ของคุณ

4

แล้ว symlink ง่ายๆล่ะ?

ln -s /etc/profile /etc/zsh/zprofile

นอกจากนี้คุณยังสามารถผนวกสิ่งนี้ถ้าคุณต้องการเริ่มต้นตามเงื่อนไข:

#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) shell=bash ;;
        *dash) shell=dash ;;
        *ash)  shell=ash ;;
        *ksh)  shell=ksh ;;
        *zsh)  shell=zsh ;;
    esac
fi

อืม แต่ฉันไม่คิดว่ามันจะสะอาดกว่าการหาซื้อ มีไฟล์ที่ทั้ง zsh และ bash จะอ่านหรือไม่?
phunehehe

อะไรทำให้คุณคิดว่าการจัดหาหรือสร้าง symlink ไม่ใช่โซลูชันที่ "สะอาด"
echox

ฉันแค่อยากจะบอกว่าถ้าจำเป็นฉันต้องการแหล่งไฟล์แทนที่จะจัดการ symlink ฉันไม่ต้องการสร้างการพึ่งพาระหว่างไฟล์มากมาย
phunehehe

1
ทางเลือกมากขึ้นในการพกพามี/bin/ls -l /proc/$$/exe ps -o comm= -p $$สิ่งนี้ไม่น่าเชื่อถืออย่างเต็มที่เพราะเชลล์บางตัวทำงานแตกต่างกันไปขึ้นอยู่กับวิธีการเรียกใช้ ในทางปฏิบัติเพียงแค่การทดสอบ$0ใน.profileมีแนวโน้มที่จะเป็นตัวบ่งชี้ที่ดีกว่า แต่หอยมากที่สุดที่มีคุณสมบัติที่มีประโยชน์ (ทุบตี ksh, zsh) ได้รับการยอมรับเพียง (และรุ่นของพวกเขาระบุซึ่งเป็นบวกใหญ่) โดยการทดสอบตัวแปรบาง: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'หยุดความชั่วร้าย'

echox, คำสั่ง case ของคุณตรวจจับ zsh4 # ไม่ถูกต้องกำหนดเชลล์ของเราโดยไม่ใช้ $ SHELL, ซึ่งอาจอยู่ที่ shell = "sh" ถ้า test -f / proc / mounts; ในกรณีนั้น $ (/ bin / ls -l / proc / $$ / exe) ใน bash) shell = bash ;; * dash) shell = dash ;; * ash) shell = ash ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt

0

สำหรับตัวแปรฉันมีความรู้สึกว่าคุณขาดโมดูลและโมดูลไฟล์ [1] เมื่อคุณเริ่มทำเช่นนั้นจะเป็นการง่ายที่จะสร้างโปรไฟล์ทั่วไปสำหรับเชลล์ต่างๆ (รวมถึง bash & zsh), python, perl และสภาพแวดล้อมอื่น ๆ อีกมากมายทั้งหมดนี้มาจากความสะดวกสบายของไฟล์โมดูลเดียว

นอกจากนี้ยังเป็นไปได้ที่จะกำหนดชื่อแทนในลักษณะเดียวกัน อย่างไรก็ตามคุณจะพบว่านามแฝงไม่ได้รับการสืบทอดอย่างดีระหว่างเชลล์ต่อเนื่องและอาจต้องแก้ไขปัญหา

[1] http://en.wikipedia.org/wiki/Environment_Modules_(software)

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