คำสั่ง vs โปรแกรม?


19

ฉันค้นหาความแตกต่างระหว่างadduserและuseraddและคำอธิบายก็useraddคือคำสั่งในขณะที่adduserเป็นสคริปต์ Perl ฉันเข้าใจว่าสคริปต์ perl คืออะไร แต่สิ่งที่ฉันไม่เข้าใจคือcommandตอนนั้นคืออะไร

ฉันมักจะคิดว่าคำสั่งที่ชอบls, ln, cdฯลฯ เป็นโปรแกรมที่ง่ายทุกที่เขียนในภาษาสิ่งที่เพียงแค่ทำสิ่งหนึ่ง อะไรคือความแตกต่างระหว่าง "โปรแกรมอย่างง่าย" เหล่านี้และสคริปต์ Perl

แน่นอนฉันรู้ว่าสคริปต์ (perl) ไม่ได้รวบรวม แต่ตีความที่รันไทม์ แต่ฉันเดาว่าไม่ใช่ความแตกต่างเท่านั้น?


1
อย่าเน้นมากเกินไปกับการคอมไพล์ vs ตีความในกรณีนี้ คุณอาจมีเปลือกตีความ (แม้ว่าทำไมคุณต้องการหนึ่งคือสงสัย) มุ่งเน้นไปที่ความจริงที่ว่ารหัสสำหรับการดำเนินการคำสั่งเป็นส่วนที่คงที่ของซอร์สโค้ดของเชลล์ในขณะที่สคริปต์อยู่ภายนอกไม่ควรสันนิษฐานว่ามีอยู่จริงหรือทำงานเหมือนกันในสองระบบที่แตกต่างกันเล็กน้อยและอาจ ไม่จำเป็นแม้แต่จะต้องมีการพึ่งพาทั้งหมด สคริปต์มีความยืดหยุ่นมากขึ้นและด้วยเหตุนี้จึงมีความน่าเชื่อถือน้อยกว่าโดยทั่วไปในขณะที่คำสั่งจะทำงานได้ทุกที่ที่เชลล์ต้องการ
Frank Thomas

ในคำง่าย ๆ : คำสั่งคือสิ่งที่สามารถดำเนินการในขณะที่โปรแกรมเป็นไบนารีที่สามารถดำเนินการ
Pithikos

คำตอบ:


32

กล่าวง่ายๆคือคำสั่งคือคำสั่ง (หรือชุดคำสั่ง) ที่คอมพิวเตอร์ใช้

คำสั่งแบบสแตนด์อะโลน

สาธารณูปโภคพื้นฐานยูนิกซ์เช่นls, lnฯลฯ (ปกติ) เขียนใน C และเรียบเรียงให้เป็นปฏิบัติการแบบสแตนด์อะโลนโปรแกรมที่ไม่ต้องใช้ล่ามที่จะดำเนินการ; พวกเขามักจะต้องการไฟล์ไลบรารีบางไฟล์ที่จะติดตั้งบนระบบ แต่นั่นคือคำตอบสำหรับคำถามอื่น

สคริป

สคริปต์คือชุดของคำสั่งและในความเป็นจริงสคริปต์ตัวเองถือเป็นคำสั่ง

Perl สคริปต์เป็นลำดับของงบ Perl และต้องมีการperlปฏิบัติการ (สแตนด์อะโลนและเรียบเรียง) โปรแกรมการตีความงบ Perl

บางครั้งขนาดใหญ่และซับซ้อนสคริปต์การแปลความหมาย (ในภาษาเช่น Perl, Python และ Ruby) นอกจากนี้ยังจะเรียกว่าโปรแกรมการตีความในขณะที่คำว่าสคริปต์ถูกสงวนไว้สำหรับสคริปต์สั้นและง่าย

เชลล์สคริปต์เป็นลำดับของคำสั่งอื่น ๆ (ประเภทของคำสั่งใด ๆ ) และมันต้องใช้ระบบปฏิบัติการยูนิกซ์เปลือกเช่นทุบตีในการตีความสคริปต์ จากหน้า Bash man:

Bash เป็นตัวแปลภาษาคำสั่งที่เข้ากันได้กับ sh ซึ่งดำเนินการคำสั่งที่อ่านจากอินพุตมาตรฐานหรือจากไฟล์

เชลล์ในตัว

เชลล์มักมีคำสั่งในตัวซึ่งไม่ใช่โปรแกรมหรือสคริปต์แบบสแตนด์อะโลน แต่เป็นส่วนหนึ่งของเชลล์เองและรันโดยเชลล์โดยตรง cdเป็นตัวอย่างของคำสั่งในตัว

บางครั้งมีคำสั่งที่มีอยู่ในตัวเชลล์และคำสั่งแบบสแตนด์อโลนในเวลาเดียวกันเช่นechoคำสั่ง

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

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

เรียกใช้ echo รุ่นในตัว:

$ echo --version
--version

เรียกใช้echoโปรแกรมสแตนด์อะโลน:

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

หมายเหตุ: ข้อมูลเฉพาะด้านบนอ้างถึงสภาวะแวดล้อม Unix แต่ใช้หลักการเดียวกันกับสภาพแวดล้อม Windows


เสียงสะท้อนที่คุณอ้างถึงใน windows นั้นก็ต่อเมื่อคุณติดตั้ง Cygwin คุณจะไม่พบ echo. * ใน windows เนื่องจากเป็นคำสั่งเชลล์ CMD อย่างแท้จริง (echo in powershell ใช้นามแฝงว่าเป็นวัตถุเขียน)
Jim B

@JimB จริง ฉันแก้ไขบรรทัดสุดท้ายเพื่อชี้แจงสิ่งที่ฉันต้องการ บังเอิญฉันเพิ่งเริ่มเรียนรู้ PowerShell ในสัปดาห์นี้ (โชคดีที่ฉันไม่ได้ทำงานกับ.batไฟล์มาหลายปีแล้ว)
Anthony G - ความยุติธรรมสำหรับโมนิก้า

2

คำสั่งในตัวเป็นส่วนหนึ่งของเปลือก โปรแกรมดำเนินการโดยเชลล์

คำสั่ง Builtin มีอยู่ภายในตัวเชลล์เอง เมื่อชื่อของคำสั่ง builtin ถูกใช้เป็นคำแรกของคำสั่งง่าย ๆ (ดูSimple Commands ) เชลล์จะเรียกใช้งานคำสั่งโดยตรงโดยไม่ต้องเรียกใช้โปรแกรมอื่น คำสั่งในตัวมีความจำเป็นต่อการใช้งานฟังก์ชั่นที่เป็นไปไม่ได้หรือไม่สะดวกในการขอรับด้วยยูทิลิตี้แยก

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands


แต่useraddไม่ใช่เปลือกในตัว เว็บไซต์เพิ่งพูดว่า "command" ไม่ใช่ "command built-in" คำอธิบายนี้เกี่ยวข้องกับคำถามนี้อย่างไร
Barmar

1

คำสั่งหมายถึงวิธีบอกแอปพลิเคชันหรือระบบให้ทำบางสิ่ง

โดยทั่วไปแล้วแอปพลิเคชันจะยอมรับคำสั่งที่แตกต่างกันมากมายไม่ว่าจะจาก GUI stdinแต่วิธีการอื่น ๆ นั้นเป็นไปได้เช่นซ็อกเก็ต UNIX หรือไพพ์ที่มีชื่อชื่อเว็บ API บางประเภทการเชื่อมต่อ RPC หรือโปรโตคอลที่กำหนดเองอื่น ๆ

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

แต่คุณจะไม่เรียกใช้คำสั่งของ Photoshop แต่คุณจะต้องออกคำสั่งภายใน GUI อย่างแน่นอน

อย่างไรก็ตามคำนี้อาจหมายถึงสิ่งที่แตกต่างกันสำหรับคนอื่น ในตัวอย่างของคุณคำสั่งจะถูกใช้เพื่ออธิบายถึงการปฏิบัติการที่รันโดยตรงกับไฟล์ที่ต้องการล่ามสคริปต์ในการทำงาน ความแตกต่างอาจมีความสำคัญเนื่องจากเมื่อคุณใช้สคริปต์ Perl /usr/bin/perlเป็นไบนารีที่ใช้งานจริง (ดังนั้นหากคุณต้องการฆ่าสคริปต์ Perl ที่ใช้งานมานานนั่นคือสิ่งที่คุณต้องมองหาps) อย่างไรก็ตามเชลล์ส่วนใหญ่มีคำสั่ง "ในตัว" ซึ่งเป็นคำสั่งของเชลล์เองและจะไม่ทำให้ไฟล์ภายนอกรันได้ ตัวอย่างเช่นcdจัดการด้วยbashตัวเองและจะไม่โทร/sbin/cdหรือคล้ายกัน


มุมมองที่น่าสนใจ ในระดับของสิ่งที่เป็นนามธรรมที่คุณกำลังดูอยู่นี้ฉันอยากจะเรียกมันว่า 'การเรียกร้อง' หรือ 'ท่าทาง' หรือแม้แต่ไปกับคำศัพท์แอนดรอยด์ 'เจตนา' ที่กล่าวว่าฉันไม่ทราบว่าฉันชอบความคิดในการรวบรวม vs ตีความเกณฑ์ ตัวอย่างเช่น PowerShell นั้นตีความได้แบบไฮบริด (, Net) แต่ในฐานะเชลล์มันมีคำสั่งอยู่ภายใน codebase แต่จากนั้นคุณสร้างจุดที่ดีเกี่ยวกับไฟล์ประมวลผลภายนอก (รหัสเครื่อง) ที่รวบรวมไว้ซึ่งแตกต่างจากสคริปต์ แต่ก็มีคำสั่งด้วย อย่างที่ฉันพูดมุมมองที่น่าสนใจ
Frank Thomas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.