Làm thế nào để nói một lệnh shell là chương trình hoặc chức năng?


8

Tôi muốn biết liệu các lệnh mà chúng ta gọi trong shell là các hàm hoặc chương trình .


1
Bạn đang phân biệt giữa "chương trình nhỏ" và "chức năng" nào?
JdeBP

Bạn có thể nhập các lệnh vào một chương trình shell cho phép bạn lập trình shell hoạt động và thực hiện các chức năng sử dụng lệnh mà shell được lập trình để ra lệnh cho các chương trình khác từ các hàm shell.
txtechhelp

Câu trả lời:


15

Nó phụ thuộc.

Các lệnh có thể rơi vào nhiều loại: nội dung, bí danh, hàm, thực thi (tập lệnh và nhị phân trong đường dẫn tìm kiếm).

Trên dòng lệnh, chúng chiếm một không gian tên phẳng, duy nhất có thể ghi đè. Có rất nhiều cách để phân loại các chương trình:

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}

Chúng tôi biết rằng đó flà một chức năng.

$ which a
alias a='cat'
        /usr/bin/cat

Chúng tôi biết đó alà một bí danh.

$ which yes
/usr/bin/yes

Chúng tôi biết rằng đó yeslà một chương trình.

$ builtin echo ; echo $?

0

Vỏ có echođược xây dựng trong ...

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1

Sầu nhưng không cho cat. Nếu có nội dung dựng sẵn hoặc bí danh nhưng bạn khăng khăng gọi chương trình thay vào đó, hãy thêm tiền tố vào lệnh với dấu gạch chéo ngược:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0

3
Ngoài ra, một lệnh là một chương trình trong một lần thực hiện * nix cũng có thể trở thành shell dựng sẵn (= function) trong một lệnh khác.
jamesqf

1
@jamesqf, yeah, shell có các công cụ tiêu chuẩn được tích hợp, nhưng các lệnh dựng sẵn không giống như các hàm. Chạy ví dụsh -c 'type true; f() { echo x; }; type f'
ilkkachu

5
Lưu ý rằng nói chung, typetốt hơn là whichcho hầu hết các mục đích. Xem unix.stackexchange.com/q/85249/135943
tự đại diện

@ilkkachu: Điều đó phụ thuộc vào định nghĩa của bạn về "giống như". Tất nhiên chúng được thực hiện khác nhau, nhưng với người dùng thông thường gõ một lệnh, chúng có chức năng giống nhau.
jamesqf

1
@jamesqf, ngay cả khi người dùng thông thường của bạn không (biết cách) sử dụng các chức năng, việc cho rằng chúng giống như nội dung chỉ là khó hiểu.
ilkkachu

4

Định nghĩa của a functionlà trả về các giá trị đơn và không xuất ra bất cứ thứ gì. Các hàm Shell nói riêng có thể rất tốt và có thể có đầu ra hoặc các tác dụng phụ khác, vì giá trị trả về của các hàm rất hạn chế.

A commandlà một hướng dẫn được đưa ra bởi người dùng để bảo máy tính làm một việc gì đó, ví dụ, thực hiện một chương trình duy nhất hoặc một nhóm các chương trình được liên kết.

A programlà một chuỗi các lệnh (tức là các lệnh) được đưa cho máy tính và có thể hiểu được bởi bộ xử lý trung tâm (CPU) của máy tính. các hướng dẫn này cho biết hoạt động nào mà máy tính sẽ thực hiện trên một tập hợp dữ liệu.

Có nói rằng, functionslà tập hợp con hợp lý của chương trình. Gọi một cái là hoàn toàn trong quá trình của bạn. Đây commandlà một chương trình (hoặc shell tích hợp) có thể được thực thi từ shell lệnh. Lệnh thực hiện các chức năng thực hiện một nhiệm vụ. Điều ngược lại là không chính xác.


10
"một hàm trả về một giá trị duy nhất và không xuất ra bất cứ thứ gì" - tốt, vâng, theo nghĩa toán học có thể. Nhưng trong các ngôn ngữ lập trình bắt buộc, nó thực sự phổ biến đối với "hàm" có nghĩa chỉ là một chương trình con, một ngôn ngữ có thể làm bất cứ điều gì. Và các hàm shell nói riêng rất có thể có đầu ra hoặc các tác dụng phụ khác, vì giá trị trả về của các hàm rất hạn chế.
ilkkachu

@ilkkachu. Cảm ơn bạn. Tôi đã cập nhật câu trả lời. Xin vui lòng sửa lại ;-)

3
Tôi nghĩ những định nghĩa này là từ bối cảnh ngôn ngữ lập trình, không phải bối cảnh vỏ. Vâng, tôi biết ngôn ngữ shell ngôn ngữ lập trình, nhưng ý tưởng về "hàm" của nó khá khác với định nghĩa toán học hoặc khoa học máy tính - trong shell, tất cả các lệnh (cho dù là nội hàm, hàm, bí danh, chương trình hoặc tập lệnh) giống nhau, và chỉ đơn giản là các loại thực hiện khác nhau.
Toby Speight

1
... * chủ yếu là * như nhau; nội dung có thể thay đổi trạng thái của chính trình bao, trong khi các chương trình bên ngoài không thể gọi chdir()hoặc setenv()trong trình bao, đối với chúng, là một quy trình cha khác biệt.
Charles Duffy

1

Tôi muốn biết liệu các lệnh mà chúng ta gọi trong shell là các hàm hoặc chương trình?

Đúng.

Cụ thể, khi bạn nhập một số văn bản và nhấn enter, trình bao phải xác định xem đó là:

  1. một alias,
  2. một chức năng,
  3. một lệnh tích hợp,
  4. một tập tin thực thi.
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.