Apa yang dilakukan perintah tanpa argumen?

22

Apa yang dilakukan setperintah tanpa argumen?

Seperti yang saya lihat itu mencetak variabel lingkungan saya seperti envperintah tetapi dalam urutan abjad. Dan selanjutnya mencetak beberapa informasi yang berbeda (variabel? Fungsi?) Seperti:

__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"
}

Apa itu dan dari mana asalnya?

Saya tidak dapat menemukan informasi tentang setperintah tanpa argumen. Sebenarnya saya tidak memiliki manhalaman untuk setdistribusi Linux saya sama sekali.

Aleksandr Kovalev
sumber
1
"Bangsat ini sangat rumit sehingga layak bagiannya sendiri." Lihat dokumen
galath

Jawaban:

17

set adalah built-in shell yang menampilkan semua variabel shell, tidak hanya yang lingkungan, dan juga fungsi shell, yang adalah apa yang Anda lihat di akhir daftar.

Variabel ditampilkan dengan sintaks yang memungkinkan mereka untuk diatur ketika garis dieksekusi atau bersumber.

Dari bash halaman manual :

Jika tidak ada opsi atau argumen yang diberikan, set menampilkan nama dan nilai semua variabel dan fungsi shell, diurutkan sesuai dengan lokal saat ini, dalam format yang dapat digunakan kembali sebagai input untuk pengaturan atau pengaturan ulang variabel yang saat ini ditetapkan.

Pada cangkang yang berbeda, perilakunya tidak harus sama; misalnya, ksh settidak menampilkan fungsi shell.

Jlliagre
sumber
3
Itu karena kshtidak menyimpan definisi fungsi dalam variabel shell.
cuonglm
2
@cuonglm Keputusan desain yang bijak yang dibuat oleh dgk! ;-)
jlliagre
7

Karena setmemiliki output dan which setmengembalikan apa pun yang Anda tahu itu bagian dari shell yang Anda gunakan, mungkin bash.

man bash menyebutkannya berkali-kali tetapi lebih mudah untuk ditautkan dalam dokumentasi online .

Builtin ini sangat rumit sehingga layak bagian sendiri. set memungkinkan Anda untuk mengubah nilai opsi shell dan mengatur parameter posisi, atau untuk menampilkan nama dan nilai variabel shell.

set memiliki spesifikasi panggilan:

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

jadi jika Anda ingin menemukannya secara manual di baris perintah Anda dapat mencari

/set.*abef
pengguna1133275
sumber
which settergantung pada cangkang Anda. Setidaknya zshakan melaporkannya untuk Anda. Anda juga dapat membaca ini untuk lebih jelasnya.
cuonglm
Tidak mungkin pertanyaannya tentang apa pun kecuali pesta karena memiliki dominasi pasar yang besar, dan siapa pun yang menggunakan shell non-standar tidak perlu mengajukan pertanyaan ini.
user1133275
6

setadalah shell builtin , digunakan untuk opsi shell dan set unset dan parameter posisi.

Tanpa argumen, setakan mencetak semua variabel shell (variabel lingkungan dan variabel dalam sesi saat ini) diurutkan dalam lokal saat ini .

Anda juga dapat membaca dokumentasi bash .


Ada beberapa peringatan.

set "$var"akan memberikan varnilai $1. Jika $varmulai dengan -atau +, maka $varkonten diperlakukan sebagai urutan opsi shell. Jika $varberisi opsi yang tidak valid, sebagian besar shell POSIX akan mencetak kesalahan. yashdan zshdi sh, kshemulasi tidak hanya mencetak kesalahan, tetapi juga pilihan pengaturan valid. Sementara yashberhenti mengatur opsi pada opsi tidak valid pertama, zshakan menetapkan semuanya. Dalam yash:

var=-fxd; set "$var"

fdan xakan hadir $-, sementara:

var=fdx; set "$var"

hanya fhadir di $-. Dalam kedua kasus, fdan xakan hadir di $-dengan zshdi shdan kshemulasi.

Untuk melindungi Anda dari situasi itu, Anda dapat memberikan --argumen pertama untuk menetapkan parameter posisi meskipun diawali dengan -atau +:

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

akan ditugaskan $varuntuk $1, terlepas dari kontennya.

set -- tanpa argumen lebih lanjut akan membatalkan semua parameter posisi.

Jika argumen pertama adalah -, perilaku tersebut tidak ditentukan. Semua shell POSIX yang dikenal akan di-unset xdan vopsi (kecuali posh), dan menetapkan apa pun setelah -parameter posisi:

set -xv - -f

akan ditugaskan -funtuk $1. set -juga tidak menghapus parameter posisi. Schily osh juga berperilaku seperti itu. Pusaka sh jangan disetel vdan xopsi.

Satu-satunya pengecualian shell POSIX adalah yash, yang memperlakukan -sebagai parameter posisi pertama:

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

Schily bahkan tidak melakukan apa pun jika -ada dalam argumen:

$ 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
cuonglm
sumber
saya tidak pernah mengerti mengapa orang akan link ke mana saja tapi yang pertama ... Anda mungkin ingin menyebutkan perbedaan antara set -- $unset, set - $unset, set $unset, dan set "$unset"dan sebagainya - biasanya mereka perbedaan yang membuat orang menjadi semacam masalah di tempat pertama.
mikeserv
@ mikeserv: Yah, saya menambahkan rincian lebih lanjut, tapi saya tidak mengerti apa yang Anda maksud saat digunakan $unset.
cuonglm
@cuonglm Perintah ini set $unsetakan bertindak sama persis seperti setuntuk variabel yang tidak disetel. Tetapi set "$unset" akan mencatat, jika unsetsebenarnya adalah variabel yang tidak disetel. A set - $unsetmenghapus opsi -vdan -xmengatur (dalam bash).
@ Binzebra: Ah, tentu saja, bagi saya, lebih baik digunakan unset_var. Dan perhatikan juga bahwa set "$unset"sebenarnya diatur $1ke kosong. Itu tentang ekspansi shell, tidak sepenuhnya untuk set, jadi saya tidak menyebutkannya.
cuonglm
1
@ mikeserv: Perilaku poshdan yashberbeda ketika -muncul. Anda dapat membaca pembaruan saya (dan merasa bebas untuk memperbaikinya).
cuonglm
2

Jika Anda bekerja di dalam bash shell, ketik help set.

Di akhir bantuan dicetak, baca:

Jika tidak ada ARG yang diberikan, semua variabel shell dicetak.

Jadi, argumen no setmencetak semua variabel yang dikenal ke shell.


sumber
Saya ingin tahu apakah set -x; setakan membantu
ILMostro_7