ฉันต้องการเติมเต็มคำตอบของ ravi :
ลักษณะการทำงานนี้เป็นลักษณะเฉพาะของ Ubuntu (และอาจเป็น distros ที่ได้รับมากที่สุด) เนื่องจาก~/.bashrc
ไฟล์เริ่มต้นของคุณเริ่มต้นด้วยการลัดวงจร Ubuntu 18.04 เป็นต้น
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
สิ่งนั้นจะหยุดการประเมินไฟล์ถ้ามันกำลังทำงานในเชลล์ที่ไม่มีการโต้ตอบซึ่งเป็นกรณีของสคริปต์ของคุณเนื่องจากสคริปต์ทั้งหมดจะทำงานในเชลล์ที่ไม่ต้องมีการโต้ตอบและหลังจากนั้นทุกไฟล์คุณsource
จะได้รับคุณสมบัตินี้
eval
สับ
ฉันพบแฮ็กที่น่าเกลียดในการแก้ปัญหา Ubuntu โดยเฉพาะโดยใช้eval
แทนsource
:
eval "$(cat ~/.bashrc | tail -n +10)"
มันแค่ข้ามสองสามบรรทัดแรกและประเมินส่วนที่เหลือ~/.bashrc
เพื่อให้ส่วนที่เหลือถูกประเมินและแก้ไขการดำเนินการปัจจุบัน
ระวังเป็นเลขอาถรรพ์และอาจไม่สามารถใช้งานได้กับ Ubuntu ทุกรุ่น แต่อาจเป็นทางออกที่ดีถ้าคุณสร้างสคริปต์สำหรับระบบที่รู้จักมากขึ้นหรือน้อยลง
โซลูชันที่นักเล่นอาจเกี่ยวข้องกับการใช้ regex เพื่อกำหนดเป้าหมายบิตเฉพาะที่หยุดการประเมินผล
Shebang ทางเลือก
ทางเลือกอื่นที่อาจทำงานได้ดีขึ้นในบางสถานการณ์คือการบังคับให้สคริปต์ทำงานในเชลล์แบบโต้ตอบโดยการเพิ่มการตั้งค่าสถานะในshebang :
#!/bin/bash -i
ระวังสิ่งต่าง ๆ :
- มันเป็นวิธีปฏิบัติที่ดีกว่าที่จะใช้
#!/usr/bin/env bash
รูปแบบ แต่วิธีนี้คุณไม่สามารถเริ่มต้นเปลือกมีข้อโต้แย้ง
- ใช้
-i
มีชุดของตัวเองของผลกระทบในหมู่พวกเขาโปรแกรมจะแจ้งให้สำหรับผู้ใช้โต้ตอบนี้มักจะไม่ได้มีไว้สำหรับสคริปต์ตัวอย่างเช่นการติดตั้งdeb
แพคเกจอาจหยุดสคริปต์ที่แจ้งdpkg configure
- ผมเริ่มพยายามที่จะใช้
set -i
และset +i
เพื่อเปิดคุณลักษณะในและนอกสถานที่ที่ฉันต้องการมัน แต่นี้ไม่ได้ทำงาน