Linux & Shell - Shell จำเป็นหรือไม่


8

คำถามที่สมัครใหม่ทั้งหมด

ทำไมเราต้องมีเชลล์ในลีนุกซ์? เป็นตัวอย่างเมื่อฉันพิมพ์ - ค้นหา -name xy * - ฉันถูกบอกว่าเชลล์ใช้อินพุตนี้และเรียกใช้คำสั่ง find (ตรวจสอบให้แน่ใจว่า wild card ตีความได้อย่างถูกต้องและทั้งหมดนั้น) สิ่งนี้ไม่สามารถทำได้โดยปราศจากแนวคิดของเชลล์หรือไม่ ... ถ้าเชลล์ติดตามกระบวนการต่าง ๆ สิ่งนี้ไม่สามารถทำได้หากไม่มีมัน

นอกจากนี้สาเหตุที่ฉันสามารถพิมพ์> ls xy * และรับเอาต์พุตที่ถูกต้องขณะที่ฉันต้องหลบหนี * ด้วย a \ in find - find -name xy \ * เชลล์ทำการขยายตัวไวด์การ์ดสำหรับการ์ดหนึ่งและไม่ใช้กับไฟล์ปฏิบัติการอื่นหรือไม่?

ขอบคุณ.

linux  bash  shell 

9
การใช้ Linux แบบไม่มีเปลือกเปรียบเสมือนการขับรถเฟอร์รารี่ 50 กม. / ชม. ผ่านการจราจรในเมือง ความสนุกจะหายไป
vava

คำตอบ:


23

สิ่งนี้ทำได้หรือไม่ถ้าไม่มีแนวคิดของเชลล์?

ไม่เลย คุณต้องการสิ่งที่ตีความเจตนาของคุณและเรียกใช้โปรแกรมที่เหมาะสม สิ่งนั้นเรียกว่าเปลือกหอย

แก้ไข: เพื่อหลีกเลี่ยงความสับสน "shell" ไม่ได้หมายถึง "command line interface" จากhttp://en.wikipedia.org/wiki/Shell_(computing) :

"โดยทั่วไปเชลล์ของระบบปฏิบัติการจะแบ่งออกเป็นหนึ่งในสองประเภท: command-line และกราฟิกเชลล์คำสั่งให้ command-line interface (CLI) กับระบบปฏิบัติการในขณะที่เชลล์กราฟิกให้ส่วนต่อประสานกราฟิกกับผู้ใช้ (GUI) หมวดหมู่จุดประสงค์หลักของเชลล์คือการเรียกใช้หรือ "เรียกใช้" โปรแกรมอื่นอย่างไรก็ตามเชลล์มักจะมีความสามารถเพิ่มเติมเช่นการดูเนื้อหาของไดเรกทอรี "

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


ดังนั้นคุณบอกว่าใน Windows ปุ่มเริ่มเรียกว่าเชลล์? :-)

5
มันไม่ใช่การใช้งานทั่วไป แต่ GUI เป็นเชลล์เนื้อหา (อย่างน้อยถ้าพวกมันทำงานนอกเคอร์เนล) ปุ่มเริ่มเป็นเพียงคุณสมบัติของ GUI ที่ ...
dmckee --- อดีตผู้ดูแลลูกแมว

ปุ่มเริ่มเป็นสิ่งที่แน่นอน "ที่ตีความเจตนาของคุณและเรียกใช้โปรแกรมที่เหมาะสม" OTOH, Linux shell สามารถเรียกได้ว่าเป็นคุณสมบัติของ TUI (Text User Interface)

11
@Paul: Explorer โปรแกรมที่มีปุ่มเริ่มต้นคือ windows shell ในความเป็นจริงมันเป็นเชลล์ของ Windows; มันสามารถถูกแทนที่
moonshadow

1
ใช่ปุ่มเริ่มสามารถมองเห็นเป็นเปลือก ไม่ใช่เชลล์แบบโต้ตอบ แต่เป็นเชลล์อย่างไรก็ตาม โดยปกติ แต่เมื่อมีคนกล่าวว่า "หอย" พวกเขาหมายถึงการโต้ตอบพรอมต์ (ตัวอย่างเช่นคำสั่งพรอมต์บนหน้าต่างเป็นเปลือกดั้งเดิม)

5

แน่นอนคุณสามารถทำทุกอย่างผ่าน GUI Windows 'Find Files (จาก XP และเก่ากว่า) เป็น GUIsh ที่เทียบเท่ากับคำสั่งที่คุณพิมพ์

ตอนนี้ทำไมผู้ใช้ UNIX (และ Linux) ถึงชอบเชลล์? เนื่องจากคุณสามารถใช้เอาต์พุตป้อนเข้าโปรแกรมอื่นและรับเอาต์พุตที่แตกต่างกัน ตัวอย่างเช่น:

find | grep burek

เหล่านี้มีสองคำสั่งfindและgrepหนึ่งให้อาหารอื่น ๆ findรายชื่อไฟล์ทั้งหมดในปัจจุบันและโฟลเดอร์ย่อยทั้งหมดต่อหนึ่งบรรทัดและพิมพ์ออกเส้นเหล่านั้นเท่านั้นที่มีgrepburek

ตอนนี้มีสิ่งอื่น ๆ ที่ซับซ้อนกว่าเช่น:

ls -R | sort | uniq

ls -Rแสดงรายการไฟล์ในโฟลเดอร์ปัจจุบันและโฟลเดอร์ลูกและsortเรียงลำดับผลลัพธ์ uniqจากนั้นให้เราบรรทัดที่ไม่ซ้ำกันเท่านั้น

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

ด้านล่าง: ถ้าคุณถามสิ่งนี้คุณไม่ต้องการมัน บรรทัดคำสั่งไม่มีประโยชน์สำหรับคุณในฐานะผู้ใช้ทั่วไป บรรทัดคำสั่งนั้นยอดเยี่ยมสำหรับ sysadmins สำหรับนักพัฒนาและผู้ที่ต้องการยุ่งกับคอมพิวเตอร์ของพวกเขาในวิธีที่รวดเร็วอย่างรวดเร็ว


1

ใช่คุณสามารถเรียกใช้คำสั่ง find ได้โดยไม่ต้องใช้เชลล์คุณต้องมีบางโปรแกรมที่จะเริ่มต้นและคุณต้องมีโปรแกรมเพื่อแสดงผลลัพธ์ หลายครั้งที่คุณใช้คุณสมบัติของเชลล์และคำสั่งนั้นจะต้องใช้เชลล์เพื่อตีความเจตนา

เช่น piping, redirection และ globbing เป็นคุณสมบัติของเชลล์และจะต้องใช้เชลล์ในการตีความ "find. -name myfile" ไม่ได้ใช้คุณสมบัติใด ๆ ของเชลล์และสามารถเรียกใช้โดยไม่มีเชลล์ "find. -name myfile | sort> output" ใช้ทั้ง piping และ redirection และคุณต้องการเชลล์เพื่อแปลความหมายนั้น

สำหรับการหลบหนี xy * มีความแตกต่างกันเล็กน้อยถ้าเป็นอินพุตที่จะค้นหาหรือเอาต์พุตของการ rediction เชลล์จะขยายออกด้วยวิธีใดวิธีหนึ่ง

หากมีไฟล์ชื่อ xyz ในไดเรกทอรีปัจจุบัน

หา -name xy * จะทำงานเหมือนค้นหา - ชื่อ xyz ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

หากคุณพบ -name xy * และไม่มีไฟล์ที่ตรงกับ xy * ในไดเรกทอรีปัจจุบันมันจะทำงานเหมือนค้นหา -name xy *

หากไม่มีไฟล์ที่ตรงกับ xy * ในไดเรกทอรีปัจจุบัน ls> xy * จะสร้างไฟล์ชื่อ xy * หากมีหนึ่งไฟล์ที่ตรงกัน - พูด xyz มันจะหมายถึง ls> xyz หากมีหลายไฟล์ที่ตรงกับ xy * ดังนั้น ls> xy * จะล้มเหลว

อ่านเพิ่มเติมได้ที่http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html


อ่านโหมดที่ไหน
Thomi

1

ระบบปฏิบัติการที่ไม่สำคัญไม่เรียกใช้ตัวแปลบรรทัดคำสั่งในเคอร์เนล

พวกเขาเรียกว่ามันเป็นโปรแกรมและโปรแกรมที่เรียกว่าเปลือก สถานการณ์ใน GUI ดูเหมือนว่าจะมีการผสมกัน แต่อย่างน้อยระบบปฏิบัติการบางอย่างก็ทำงานนอกเขตเคอร์เนลเช่นกัน

ตอนนี้มีอย่างที่จำเป็นสำหรับการเปลือกในการทำงานเช่นยูนิกซ์เปลือกไม่มี แต่คุณทำต้องอินเตอร์เฟซ


1

เพื่อตอบคำถามที่สองของคุณ ... เชลล์จะพยายามขยายทุกสิ่งเท่าที่ทำได้เท่าที่จะทำได้เว้นแต่คุณจะป้องกันไว้ การหลีกเลี่ยง * ป้องกันการขยายตัวซึ่งโดยปกติจำเป็นสำหรับคำสั่ง find

ไม่ตอบคำถามด้วยคำถามคุณจะทราบได้อย่างไรว่าคำสั่ง ls แสดงรายการไฟล์เนื่องจากการขยายบรรทัดคำสั่งหรือเพราะคำสั่ง ls ค้นหารายการไดเรกทอรีจากระบบไฟล์อย่างถูกกฎหมาย เช่นฉันสามารถเขียนเชลล์เพื่อวนเช่นนี้:

for i in $(ls /home/mydir);

หรือชอบ

for i in /home/mydir/*;

พวกเขาจบลงทำให้เกิดชุดเดียวกัน


0
เหตุใดฉันจึงพิมพ์> ls xy * และรับเอาต์พุตที่เหมาะสมในขณะที่
ฉันต้องหลบหนี * ด้วย \ in find - find - ชื่อ xy \ * คือ
เชลล์ทำการขยายตัวไวด์การ์ดสำหรับหนึ่งและไม่ใช่สำหรับ
ปฏิบัติการอื่น ๆ ?

จุดหลบหนี '*' ในการเรียกใช้การค้นหาคือการป้องกันไม่ให้เชลล์ทำการขยาย ด้วยการหลบหนีคุณจะมั่นใจได้ว่าการค้นหาเห็นอาร์กิวเมนต์: ".", "-name", "xy *" หากคุณไม่ได้หลบหนี '*' ค้นหาจะเห็น ".", "-name", "xya", "xyz" (สมมติว่าเชลล์ขยาย "xy *" เป็น "xya xyz" ซึ่งจะเกิดขึ้นหาก ไฟล์ที่เริ่มต้น xy คือ xya และ xyz) ดังนั้นคำตอบสำหรับคำถามของคุณคือไม่เชลล์ไม่ขยาย '*' ในการเรียกใช้การค้นหาของคุณเพราะคุณได้ขอให้คุณไม่หนีโดยการหลีกเลี่ยง


0

Shell ใน Linux เป็นวิธีที่สะดวกและธรรมดาในการโต้ตอบกับระบบไฟล์ใน Linux และเรียกใช้คำสั่งที่มีข้อโต้แย้งและเกี่ยวข้องกับตัวแปรสภาพแวดล้อม มันมีคุณสมบัติที่มีประโยชน์มากมายเช่นการเชื่อมต่อเอาท์พุทของกระบวนการหนึ่งไปยังอินพุตของผู้อื่นเปลี่ยนเส้นทางอินพุต / เอาท์พุตไปยัง / จากไฟล์ FIFO ฯลฯ เชลล์เป็นวิธีที่ดีในการรวมโปรแกรมขนาดเล็กหลาย ๆ ตัวเข้าด้วยกัน ทำงานที่ค่อนข้างเล็กเพื่อให้สิ่งที่มีประโยชน์ บางโปรแกรมเหล่านี้ (เช่น find และ ls) ได้รับการออกแบบมาเพื่อทำงานกับมันในเชลล์

เพื่อให้เข้าใจถึงการขยายตัวโปรดจำไว้ว่าคำ (ช่องว่างที่ล้อมรอบลำดับของอักขระ aplhanumeric และ-และสัญลักษณ์อื่น ๆ บางอย่าง) เนื่องจากมี*หรือ?รูปแบบอักขระที่ไม่ได้หลบหนีหรือใส่ไว้ในเครื่องหมายคำพูด ( ") หรือเครื่องหมายอัญประกาศ'แทน ของคำที่คั่นด้วยช่องว่างด้วยชื่อไฟล์ที่ตรงกับรูปแบบ ดังนั้นถ้าคุณมีเครื่องหมายดอกจันหนึ่งคำหลังจากการขยายคุณจะมีศูนย์หนึ่งหรือหลายคำซึ่งจะได้รับการปฏิบัติโดยการทุบตีเป็นข้อโต้แย้งหลายอย่าง ต่อไปนี้เป็นการออกแบบlsคำสั่งที่เฉพาะเจาะจง: มันเข้ากับโครงร่างนี้อย่างสมบูรณ์แบบเมื่อใช้ls foo*เพื่อแสดงไฟล์ทั้งหมดที่ขึ้นต้นด้วย "foo"! มันถูกขยายออกเป็นสิ่งที่ชอบ

ls foobar boobaz

และ ls เพียงพิมพ์ไฟล์จากการขัดแย้งการตรวจสอบการมีอยู่และการเข้าไปใน fiolders เป็นต้น

แต่นั่นเป็นคำถามของปรัชญาส่วนใหญ่ ในระบบอื่น ๆ ทุกอย่างเกิดจากปุ่ม "Start" และทาสก์บาร์ ผู้ใช้บางคนใช้ได้ดี บางคนพยายามติดตั้งเชลล์เหมือนลินุกซ์ในระบบดังกล่าว นั่นเป็นเรื่องของรสนิยม แต่สำหรับการเขียนโปรแกรมสคริปต์อย่างง่าย ๆ การจัดการกับไฟล์เชลล์นั้นสะดวกมาก


0

สำหรับคำสั่งแบบโต้ตอบเชลล์อาจถูกแทนที่ด้วย GUI

แต่ประเด็นสำคัญของเชลล์คือมันเป็นภาษาสคริปต์: คุณสามารถสร้างโปรแกรมทั้งหมดที่ดำเนินการในสถานการณ์เฉพาะ (บูตเปิดเซสชันทุกวัน ... ) คุณสมบัตินี้ไม่สามารถแทนที่ด้วยเครื่องมืออื่น ๆ


และแน่นอนคุณสามารถกำหนดตารางเชลล์สคริปต์ได้ด้วยcron
Wuffers

0

แน่นอนคุณสามารถเรียกใช้ Linux และไม่เคยใช้เปลือก นอกกรอบ Linux distros มาตรฐานจำนวนมากเสนอผู้ใช้ที่บ้านอย่างที่พวกเขาต้องการหากพวกเขาเพียงต้องการตรวจสอบ facebook, ดูรูปภาพและส่งอีเมล

Linux มีข้อดีมากมาย แต่เชลล์น่าจะดีที่สุด เชลล์อนุญาตการเปลี่ยนทิศทาง I / O นี่คือสิ่งที่ผู้คนพูดถึงเมื่ออ้างถึงไพพ์ ("|") ตัวอย่างเช่น:

ฉันต้องการเชื่อมต่อกับรายการเครื่องจักรและทำแบบสำรวจว่ามีบัญชีผู้ใช้อยู่ที่ใด:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

อาจมี 0 โฮสต์ใน hostnames.txt หรืออาจมีหลายพัน สคริปต์นี้จะทำการซิปและทำแบบสำรวจซึ่งจะกระจายข้อมูลไปยัง stdout

การเขียนสคริปต์สามารถสร้างสรรค์มาก ฉันสามารถใช้อักขระ "/ >>" เพื่อเปลี่ยนเส้นทางอินพุต / เอาต์พุตจากและไปยังไฟล์ ฉันสามารถสำรวจเครื่องเหล่านั้นทั้งหมดในสคริปต์ด้านบนเอาท์พุทชื่อเซิร์ฟเวอร์จากที่มีผู้ใช้ไปยังไฟล์จากนั้นติดตามด้วยสคริปต์อื่นที่เชื่อมต่อและทำงานบางอย่างในบัญชีผู้ใช้ (ล็อค / ปลดล็อค / รีเซ็ต pw / ลบ / เพิ่มกลุ่ม / ฯลฯ )

เรียน ถึง. ต้นฉบับ =)

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