ฉันค้นพบsh -c
คำสั่ง ฉันพบมันก่อนที่จะโพสต์ที่นี่ แต่ฉันไม่สามารถหาโพสต์จาก Google ที่อธิบายได้ดังนั้นฉันอยากจะรู้ว่ามันคืออะไรและไวยากรณ์ที่สมบูรณ์ของมันคืออะไร
ฉันค้นพบsh -c
คำสั่ง ฉันพบมันก่อนที่จะโพสต์ที่นี่ แต่ฉันไม่สามารถหาโพสต์จาก Google ที่อธิบายได้ดังนั้นฉันอยากจะรู้ว่ามันคืออะไรและไวยากรณ์ที่สมบูรณ์ของมันคืออะไร
คำตอบ:
sh
เรียกโปรแกรมsh
เป็นล่ามและ-c
แฟล็กหมายถึงดำเนินการคำสั่งต่อไปนี้ตามที่ตีความโดยโปรแกรมนี้
ใน Ubuntu sh
มักจะเชื่อมโยงไปถึง/bin/dash
ซึ่งหมายความว่าหากคุณรันคำสั่งด้วยsh -c
dash shell จะถูกใช้เพื่อรันคำสั่งแทนการทุบตี เชลล์ที่เรียกใช้sh
ขึ้นอยู่กับ symlink - คุณสามารถค้นหาreadlink -e $(which sh)
ได้ คุณควรใช้sh -c
เมื่อคุณต้องการรันคำสั่งเฉพาะกับเชลล์นั้นแทนการทุบตี
คุณสามารถใช้ไวยากรณ์นี้ ( -c
แฟล็ก) ร่วมกับล่ามอื่นได้เช่นกัน การใช้งานแบบคลาสสิคอย่างหนึ่ง (ชี้ให้เห็นโดย @edwinksl คือการแก้ไขปัญหาการเปลี่ยนเส้นทางที่ไม่ทำงานกับ sudo (ที่นี่คุณสามารถใช้bash -c
หรือsh -c
)
sudo sh -c 'echo "foo" > /home/bar'
จะเขียนไฟล์bar
ที่มีข้อความfoo
ไป/home/
ในขณะที่sudo echo "foo" > /home/bar
ล้มเหลวตามที่อธิบายไว้อย่างดีที่นี่
สิ่งสำคัญคือการใช้ 'อัญประกาศเดี่ยว' รอบสตริงคำสั่งมิฉะนั้นเชลล์ปัจจุบันจะพยายามขยายก่อนที่จะถูกส่งไปยังล่ามที่คุณเรียก
เช่น (กับ python จนกว่าฉันจะคิดว่าคำสั่งที่จะให้ผลลัพธ์ที่แตกต่างในรีบ ... )
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
-c
อาร์กิวเมนต์เป็น:
อ่านคำสั่งจาก command_string ตัวถูกดำเนินการแทนจากอินพุตมาตรฐาน พารามิเตอร์พิเศษ 0 จะถูกตั้งค่าจากตัวถูกดำเนินการ command_name และพารามิเตอร์ตำแหน่ง ($ 1, $ 2, ฯลฯ ) ตั้งค่าจากตัวถูกดำเนินการอาร์กิวเมนต์ที่เหลือ
รายละเอียดอื่น ๆ ของการsh
แก้ปัญหาสามารถพบได้โดยวิ่ง:
$ man sh
ตัวอย่างของการใช้สตริงเป็นอาร์กิวเมนต์คือ:
$ sh -c "echo This is a test string"
นี่คือรายละเอียดมากขึ้นsh -c
ตัวอย่างเช่น มันจะดาวน์โหลดเอกสารจาก Google Drive และเปิดขึ้นเพื่อแก้ไขบนเดสก์ท็อป:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c
วางไข่ไม่ใช่เซสชั่นที่ไม่ใช่การเข้าสู่ระบบและไม่โต้ตอบsh
( dash
ใน Ubuntu)
คำสั่งต่อไปที่จะทำงานในเซสชั่นเชลล์ที่มันจะได้รับการปฏิบัติเป็นอาร์กิวเมนต์ (พารามิเตอร์ตำแหน่ง) 0 ( ARGV0
) และส่วนที่เหลือเป็นอาร์กิวเมนต์คำสั่งที่ ( ARGV0
) ตั้งแต่วันที่ 1 ( ARGV1
, ARGV2
, ... )
นอกจากนี้คุณยังสามารถใช้คุณสมบัติเชลล์ทั่วไปที่อนุญาตให้ทำงานในเซสชันประเภทนี้เช่นการแยกคำสั่งโดยใช้;
เพื่อใช้หลายคำสั่งการจัดกลุ่มคำสั่งโดยใช้{}
วางไข่ subshell อื่นด้วย()
เป็นต้น การใช้สิ่งเหล่านี้สามารถเปลี่ยนนิยาม / ตัวอย่างอาร์กิวเมนต์ที่กล่าวถึงก่อนหน้านี้เล็กน้อย
เพียงเพื่อทราบลักษณะการทำงานที่เฉพาะเจาะจงในการโต้ตอบหอยเท่านั้น (ค่าเริ่มต้น) เช่นการขยายตัวของประวัติศาสตร์source
ไอเอ็นจีของ~/.bashrc
และ/etc/bash.bashrc
อื่น ๆ จะไม่สามารถใช้ได้ในช่วงนี้มันเป็นไม่โต้ตอบ คุณสามารถจำลองพฤติกรรมเซสชันแบบโต้ตอบ (เกือบ) โดยใช้-i
ตัวเลือก:
sh -ic ...
ในทำนองเดียวกันคุณลักษณะที่มีเฉพาะในการเข้าสู่ระบบหอยเท่านั้น (ค่าเริ่มต้น) เช่นsource
ไอเอ็นจีของ~/.profile
(ที่ได้รับ~/.bash_profile
และ~/.bash_login
ไม่ได้อยู่) และ/etc/profile
จะไม่ทำได้เช่นเปลือกเป็นที่ไม่ใช่การเข้าสู่ระบบเปลือก คุณสามารถจำลองพฤติกรรมล็อกอินเชลล์โดยใช้-l
ตัวเลือก:
sh -lc ...
ในการจำลองเซสชันการล็อกอินและการโต้ตอบ:
sh -lic ...
sh -c
หรือไม่? จะดีเป็นพิเศษแสดงให้เห็นว่ามันได้รับมอบหมายของพารามิเตอร์ตำแหน่งที่ได้รับการกล่าวถึงในส่วนหนึ่งของ-c
man sh