Điều gì đặt lệnh mà không có đối số làm gì?


22

Những gì hiện setlệnh mà không cần tranh cãi làm gì?

Như tôi có thể thấy nó in ra các biến môi trường của tôi giống như envlệnh nhưng theo thứ tự bảng chữ cái. Và hơn nữa nó in một số thông tin khác nhau (biến? Hàm?) Như:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

Nó là gì và nó đến từ đâu?

Tôi không thể tìm thấy thông tin về setlệnh mà không có đối số. Trên thực tế tôi không có mantrang cho setbản phân phối Linux của mình.


1
"Nội dung này phức tạp đến mức nó xứng đáng với phần riêng của nó." Xem tài liệu
galath 17/2/2017

Câu trả lời:


17

set là một shell được tích hợp để hiển thị tất cả các biến shell, không chỉ các biến môi trường và cả các hàm shell, đó là những gì bạn đang thấy ở cuối danh sách.

Các biến được hiển thị với một cú pháp cho phép chúng được đặt khi các dòng được thực thi hoặc có nguồn gốc.

Từ bash trang hướng dẫn :

Nếu không có tùy chọn hoặc đối số nào được cung cấp, set sẽ hiển thị tên và giá trị của tất cả các biến và hàm shell, được sắp xếp theo ngôn ngữ hiện tại, theo định dạng có thể được sử dụng lại làm đầu vào để đặt hoặc đặt lại các biến hiện được đặt.

Trên các vỏ khác nhau, hành vi không nhất thiết phải giống nhau; ví dụ, ksh setkhông hiển thị các hàm shell.


3
Đó là bởi vì kshkhông lưu trữ định nghĩa hàm trong biến shell.
cuonglm

2
@cuonglm Một quyết định thiết kế khôn ngoan của dgk! ;-)
jlliagre

7

Bởi vì setcó đầu ra và which settrả về không có gì bạn biết đó là một phần của vỏ bạn đang sử dụng, có khả năng là bash.

man bash đề cập đến nó nhiều lần nhưng dễ dàng hơn để liên kết đến trong tài liệu trực tuyến .

Nội dung này phức tạp đến mức nó xứng đáng với phần riêng của nó. set cho phép bạn thay đổi các giá trị của các tùy chọn shell và đặt các tham số vị trí hoặc để hiển thị tên và giá trị của các biến shell.

thiết lập có đặc tả cuộc gọi của:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

vì vậy nếu bạn muốn tìm nó ở người trên dòng lệnh bạn có thể tìm kiếm bằng

/set.*abef

which setphụ thuộc vào vỏ của bạn. Ít nhất zshsẽ báo cáo nó cho bạn. Bạn cũng có thể đọc để biết thêm chi tiết.
cuonglm

Không chắc câu hỏi là về bất cứ điều gì ngoài bash vì nó có sự thống trị thị trường lớn và bất kỳ ai sử dụng shell không mặc định sẽ không cần phải hỏi câu hỏi này.
dùng1133275

6

setlà một nội dung shell , được sử dụng cho các tùy chọn shell set và unset và các tham số vị trí.

Không có đối số, setsẽ in tất cả các biến shell (cả biến môi trường và biến trong phiên hiện tại) được sắp xếp theo ngôn ngữ hiện tại .

Bạn cũng có thể đọc tài liệu bash .


Có một vài cảnh báo.

set "$var"sẽ gán vargiá trị cho $1. Nếu $varbắt đầu bằng -hoặc +, thì $varnội dung được coi là chuỗi các tùy chọn shell. Nếu $varchứa bất kỳ tùy chọn không hợp lệ, hầu hết các vỏ POSIX sẽ in lỗi. yashzshtrong sh, kshmô phỏng không chỉ in lỗi, mà còn thiết lập các tùy chọn hợp lệ. Trong khi yashdừng cài đặt tùy chọn trên tùy chọn không hợp lệ đầu tiên, zshsẽ chỉ định tất cả chúng. Trong yash:

var=-fxd; set "$var"

fxsẽ trình bày trong $-, trong khi:

var=fdx; set "$var"

chỉ ftrong hiện tại $-. Trong cả hai trường hợp, fxsẽ trình bày trong $-với zshtrong shkshthi đua.

Để bảo vệ bạn khỏi tình huống đó, bạn có thể chuyển --làm đối số đầu tiên để đặt tham số vị trí ngay cả khi nó bắt đầu bằng -hoặc +:

var=-fdx; set -- "$var"

sẽ gán $varcho $1, bất kể nội dung của nó.

set -- không có bất kỳ đối số nào nữa sẽ bỏ đặt tất cả các tham số vị trí.

Nếu đối số đầu tiên là -, hành vi là không xác định. Tất cả các vỏ POSIX đã biết sẽ bỏ đặt xvcác tùy chọn (ngoại trừ posh) và gán bất cứ thứ gì sau -cho các tham số vị trí:

set -xv - -f

sẽ giao -fcho $1. set -cũng không bỏ đặt tham số vị trí. Schily osh cũng cư xử như vậy. Gia truyền sh không bỏ đặt vxlựa chọn.

Ngoại lệ vỏ POSIX duy nhất là yash, được coi -là tham số vị trí đầu tiên:

$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx

Schily sh thậm chí không làm gì nếu -có mặt trong các đối số:

$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs

tôi không bao giờ hiểu tại sao mọi người sẽ liên kết đến bất cứ nơi nào nhưng một trong những đầu tiên ... bạn có thể muốn đề cập đến sự khác nhau giữa set -- $unset, set - $unset, set $unset, và set "$unset"vv - nó thường là những sự khác biệt đủ để mọi người vào loại rắc rối ở nơi đầu tiên.
mikeerv

@mikeerv: Chà, tôi đã thêm thông tin chi tiết, nhưng tôi không hiểu ý bạn khi sử dụng $unset.
cuonglm

@cuonglm Lệnh set $unsetsẽ hành động chính xác như setđối với một biến không đặt. Nhưng set "$unset" sẽ không lưu ý, nếu unsetthực sự là một biến unset. A set - $unsetloại bỏ các tùy chọn -v-xthiết lập (trong bash).

@BinaryZebra: Ah, tất nhiên, đối với tôi, tốt hơn là sử dụng unset_var. Và cũng lưu ý rằng set "$unset"thực sự được đặt $1thành trống. Đó là về việc mở rộng vỏ, không hoàn toàn đúng set, vì vậy tôi không đề cập đến nó.
cuonglm

1
@mikeerv: Hành vi của poshyashkhác nhau khi -xuất hiện. Bạn có thể đọc cập nhật của tôi (và cảm thấy tự do để cải thiện nó).
cuonglm

2

Nếu bạn đang làm việc bên trong vỏ bash, hãy gõ help set.

Khi kết thúc phần trợ giúp được in, hãy đọc:

Nếu không có ARG nào được đưa ra, tất cả các biến shell được in.

Vì vậy, không có đối số setin tất cả các biến được biết đến với shell.


Tôi tự hỏi nếu set -x; setnó sẽ hữu ích
ILMostro_7
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.