คำสั่ง sh -c คืออะไร?


30

ฉันค้นพบsh -cคำสั่ง ฉันพบมันก่อนที่จะโพสต์ที่นี่ แต่ฉันไม่สามารถหาโพสต์จาก Google ที่อธิบายได้ดังนั้นฉันอยากจะรู้ว่ามันคืออะไรและไวยากรณ์ที่สมบูรณ์ของมันคืออะไร

คำตอบ:


34

shเรียกโปรแกรมshเป็นล่ามและ-cแฟล็กหมายถึงดำเนินการคำสั่งต่อไปนี้ตามที่ตีความโดยโปรแกรมนี้

ใน Ubuntu shมักจะเชื่อมโยงไปถึง/bin/dashซึ่งหมายความว่าหากคุณรันคำสั่งด้วยsh -cdash 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

คุณสามารถให้ตัวอย่างของวิธีการใช้งานได้sh -cหรือไม่? จะดีเป็นพิเศษแสดงให้เห็นว่ามันได้รับมอบหมายของพารามิเตอร์ตำแหน่งที่ได้รับการกล่าวถึงในส่วนหนึ่งของ-c man sh
edwinksl

15

-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"

11

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 ...

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