thuật ngữ dòng lệnh: những phần này của một lệnh được gọi là gì?


21

Tại dòng lệnh tôi thường sử dụng các lệnh "đơn giản" như

mv foo/bar baz/bar

nhưng tôi không biết phải gọi tất cả các phần của việc này là gì:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

Tôi (nghĩ rằng tôi) biết rằng 1 là một lệnh và 2 là một đối số và có lẽ tôi sẽ gọi 3 danh sách đối số (điều đó có đúng không?).

Tuy nhiên, tôi không biết gọi 4 .

Làm thế nào là "lệnh" phức tạp hơn được dán nhãn?

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}

Tôi đánh giá cao một câu trả lời phá vỡ những gì để gọi 1,2,3,4 và những gì để gọi từng phần của ví dụ "lệnh" này ở trên.

Thật tuyệt vời khi biết thêm về những điều độc đáo / đáng ngạc nhiên mà tôi chưa bao gồm ở đây.


1
Bạn đã xem các mantrang cho gitfind, đặc biệt là phần tóm tắt?
fpmurphy

4
Bạn đã xem các trang man cho git và tìm thấy Vì vậy, câu hỏi dường như không có gì để làm với githoặc findnói đúng hơn là thuật ngữ chung cho linux.
Att Righ

Theo trang man bash trong A | B, A | Blà một đường ống dẫn , ABlệnh (đó là đáng tiếc rằng điều này có tên giống như chỉ là thế giới đầu tiên trong một lệnh). Tôi có thể gọi đối số đầu tiên là thực thi nhưng tôi không thể tìm thấy một nguồn đồng ý với tôi.
Att Righ

4
Trong bối cảnh git checkout ..., checkoutlà một tiểu ban , và trong bối cảnhsh -c ... , -clà một lựa chọn .
wjandrea

@JoL cảm ơn vì đã chỉ ra điều đó. Bạn đoán đúng, tôi đã chỉnh sửa nó. Đó là bởi vì tôi đã viết lại phần đó khoảng 4 lần khi tôi cố gắng thực hiện đúng cách
theonlygusti

Câu trả lời:


33

Tên phổ biến cho mỗi phần như sau:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. Tên lệnh (từ hoặc mã thông báo đầu tiên của dòng lệnh không phải là chuyển hướng hoặc gán biến và sau khi bí danh đã được mở rộng).

  2. Mã thông báo, từ hoặc đối số cho lệnh. Từ người đàn ông bash:

    word: Một chuỗi các ký tự được coi là một đơn vị của shell. Còn được gọi là mã thông báo.

  3. Nói chung: Đối số

  4. Dòng lệnh.

Việc ghép hai lệnh đơn giản với a |là một chuỗi hoặc đường ống:

┌─1┐ ┌──────2──────┐ ┌─2─┐ ┌──2──┐   ┌──1───┐ ┌2┐┌2┐┌2┐┌────2─────┐ ┌2┐ ┌2┐
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
│    └────────────3──────────────┘            └────────────3──────────────┘
└───────────────────────────────────4─────────────────────────────────────┘

Lưu ý rằng có chuyển hướng và bài tập biến:

┌──5──┐ ┌1┐ ┌─2─┐ ┌─2─┐   ┌───6──┐ ┌1┐ ┌─5─┐
<infile tee file1 file2 | LC_ALL=C cat >file
└─────────7───────────┘   └───────7────────┘
└─────────────────────4────────────────────┘

Trong đó (bên cạnh các số từ trên):

  1. chuyển hướng.
  2. Phân công biến.
  3. Lệnh đơn giản.

Đây không phải là một danh sách đầy đủ tất cả các yếu tố mà một dòng lệnh có thể có. Một danh sách như vậy là quá phức tạp cho câu trả lời ngắn này.


2
Trong thuật ngữ POSIX, những gì bạn gọi là đường ống là một chuỗi hoặc đường ống (mặc dù một đường ống có thể có một tùy chọn dẫn !đến phủ định trạng thái của nó). ống thay vì tham khảo cơ chế IPC được sử dụng bởi hầu hết các vỏ để thực hiện các đường ống (ví dụ, đường ống không phải sử dụng đường ống, ksh93 sử dụng ổ cắm thay thế trên một số hệ thống). Một số shell có nhiều từ khóa như time, noglobcó thể được sử dụng thay thế hoặc thêm vào !đây.
Stéphane Chazelas

1
IMHO, những điều này được gọi là đối số - không có gì khác vì vậy tôi nghĩ từ mã thông báo trong ngữ cảnh này có nghĩa là "đơn vị nguyên tử của ngữ pháp bash". Ở đây, thuật ngữ mã thông báo chỉ tồn tại trong ngữ cảnh của dòng lệnh shell chứ không phải trong ngữ cảnh của chương trình thực thi. Sẽ có một chút kỳ lạ khi nói "đây là các mã thông báo chương trình" nhưng có lẽ ít lạ hơn khi nói "mã thông báo thứ hai trong dòng lệnh là $ test". Một sự khác biệt xuất hiện cat $file, ở đây tôi muốn nói $filelà một mã thông báo, nhưng giá trị của tệp là đối số.
Att Righ

1
@PeterCordes Bạn đã đúng, <<< "'" là một chuyển hướng, không phải là một đối số. Mặc dù nó vẫn là một mã thông báo của dòng. Xin lỗi vì sự nhầm lẫn.
Isaac

1
@TOOGAM Những điều này hoàn toàn ngược lại với các định nghĩa tiêu chuẩn. Những điều người gọi cung cấp là đối số; xem Thông số chính thức của người Viking, hoặc câu hỏi SO này .
Michael Homer

1
@TOOGAM "Những gì tôi thấy là các tham số" . Hmm tôi nghĩ bạn đúng Theo thông số POSIX: "Shell thực thi một hàm (xem Lệnh Định nghĩa Hàm), tích hợp sẵn (xem Tiện ích tích hợp đặc biệt), tệp thực thi hoặc tập lệnh, đặt tên của các đối số là tham số vị trí được đánh số từ 1 đến n, và tên của lệnh (hoặc trong trường hợp hàm trong tập lệnh, tên của tập lệnh) là tham số vị trí được đánh số 0 (xem Tìm kiếm và Thực thi lệnh). " và tôi đã sai trong suốt những năm qua ... Mặc dù trong sự bảo vệ của tôi, nó được gọi làargv
Att Righ

15

Câu trả lời của @ isaac ở trên có vẻ tốt.

Tôi muốn mở rộng điều này với một số nguồn.

Tôi đoán rằng tiêu chuẩn POSIX trong một số trường hợp có thể được coi là hợp quy . Các nguồn khác có thể man bashman proc.

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

POSIX gợi ý rằng:

  1. tên lệnh (chứ không phải là lệnh, mặc dù tài liệu này sử dụng lệnh ở những nơi)
  2. Tranh luận
  3. Lập luận
  4. Lệnh (mặc dù man procsử dụng dòng lệnh )

Nó cũng có thuật ngữ cho nhiều lệnh phức tạp hơn.

Tôi nghĩ rằng lệnh này khá mơ hồ nên có lẽ tên lệnhdòng lệnh là tốt cho Clarity.j


Proc là gì? Tôi chưa bao giờ nghe về nó.
theonlygusti


5
+1 Tôi thích câu trả lời này nhất. (Trong bối cảnh cụ thể này, 2 là một tiểu ban , nhưng nói chung là có, một đối số).
kubanchot

@theonlygusti proclà một hệ thống tệp mục đích đặc biệt (tập hợp các tệp) cung cấp thông tin về trạng thái bên trong của hạt nhân. Tôi tin rằng nó là viết tắt của các quy trình (xem thêm các sysfs cung cấp thông tin về những thứ khác ngoài các quy trình). Lý do nó có liên quan được viết bởi các nhà phát triển kernel , vì vậy có thể phản ánh tốt ngôn ngữ mà họ sử dụng có thể chính thức hơn một chút.
Att Righ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.