Bağımsız değişkenler olmadan set komutu ne işe yarar?


22

setBağımsız değişkenler olmadan komut ne yapar ?

Gördüğüm gibi, ortam değişkenlerimi envkomut gibi ama alfabetik olarak yazdırıyor . Ve ayrıca aşağıdaki gibi bazı farklı bilgiler (değişkenler? İşlevleri?) Yazdırır:

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

Nedir ve nereden geliyor?

setBağımsız değişken olmadan komut hakkında bilgi bulamıyorum . Aslında Linux dağıtımımda hiç mansayfam yok set.


1
"Bu yapı o kadar karmaşık ki, kendi bölümünü hak ediyor." Belgeleri
galath

Yanıtlar:


17

set yalnızca kabuk değişkenlerini değil, tüm kabuk değişkenlerini ve aynı zamanda listenin sonunda gördüğünüz kabuk işlevlerini görüntüleyen yerleşik bir kabuktur.

Değişkenler, satırlar yürütüldüğünde veya kaynak oluşturulduğunda ayarlanmasına izin veren bir sözdizimi ile görüntülenir.

Gönderen bash manuel sayfa :

Herhangi bir seçenek veya bağımsız değişken sağlanmazsa, set geçerli kabuk değişkenlerinin ve işlevlerinin adlarını ve değerlerini geçerli yerel ayara göre sıralanmış olarak, geçerli olarak ayarlanan değişkenleri ayarlamak veya sıfırlamak için giriş olarak yeniden kullanılabilecek bir biçimde görüntüler.

Farklı mermilerde, davranış mutlaka aynı değildir; örneğin, ksh setkabuk işlevlerini görüntülemez.


3
Çünkü kshişlev tanımını kabuk değişkeninde saklamayın.
cuonglm

2
@cuonglm DGK tarafından yapılan akıllıca bir tasarım kararı! ;-)
jlliagre

7

Çünkü setçıktısı var ve which setkullandığınız kabuğun bir parçası olduğunu bildiğiniz hiçbir şeyi döndürmüyor, muhtemelen bash.

man bash bundan birçok kez bahseder, ancak çevrimiçi belgelerde bağlantı kurmak daha kolaydır .

Bu yapı o kadar karmaşıktır ki kendi bölümünü hak eder. set, kabuk seçeneklerinin değerlerini değiştirmenize ve konum parametrelerini ayarlamanıza veya kabuk değişkenlerinin adlarını ve değerlerini görüntülemenizi sağlar.

set, aşağıdaki özelliklere sahiptir:

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

bu yüzden komut satırındaki adamda bulmak isterseniz,

/set.*abef

which setmerminize bağlıdır. En azından zshsizin için rapor edecek. Ayrıca okuyabilir bu fazla ayrıntı için.
cuonglm

Sorunun büyük bir pazar hakimiyeti olduğu için bash dışında bir şeyle ilgili olması olası değildir ve varsayılan olmayan kabuğu kullanan herkesin bu soruyu sormasına gerek yoktur.
user1133275

6

setkabuk seçeneklerini ve konum parametrelerini ayarlamak ve ayarlamak için kullanılan bir kabuk yerleşikidir .

Bağımsız değişkenler olmadan settüm kabuk değişkenlerini (geçerli ortamdaki hem ortam değişkenleri hem de değişkenler) geçerli yerel ayara göre yazdırır .

Ayrıca bash belgelerini de okuyabilirsiniz .


Birkaç uyarı var.

set "$var"vardeğerine değer atayacaktır $1. Eğer $varbaşlangıç ile -ya da +, daha sonra $variçerik kabuk seçeneklerinin dizileri gibi muamele edilmiştir. Eğer $vargeçersiz seçenekleri içerir, en POSIX kabukları hatayı yazdırır. yashve zshiçinde sh, kshöykünme yalnızca hatayı yazdırmakla kalmaz, aynı zamanda geçerli seçenekleri de ayarlar. İken yashdurdurma ilk geçersiz seçeneği ayar seçenekleri, zshhepsini atar. İçinde yash:

var=-fxd; set "$var"

fve xşu $-süre içinde sunulacak :

var=fdx; set "$var"

sadece fmevcut $-. Her iki durumda da fve içinde ve öykünme ile xsunulacak .$-zshshksh

Sizi bu durumdan korumak için --, -veya ile başlasa bile konum parametresini ayarlamak için ilk argüman olarak geçebilirsiniz +:

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

atayacaktır $variçin $1içeriği ne olursa olsun,.

set -- başka argüman olmadan tüm konumsal parametreleri ayarlayamazsınız.

İlk argüman ise -, davranış belirtilmez. Bilinen tüm POSIX kabukları ayarlanmayacak xve vseçenekler (hariç posh) olacak ve -konumsal parametrelere sonra herhangi bir şey atayacaktır :

set -xv - -f

atayacaktır -fiçin $1. set -ayrıca konum parametrelerini de ayarlamadı. Schily osh da böyle davranıyor. Hatıra sh unset vve xseçenekleri yok.

İlk konumsal parametre olarak yashdavranan tek POSIX kabuk istisnası -:

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

Schily sh- , argümanlarda varsa hiçbir şey yapmaz :

$ 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

insanlar her yerde ama ilk birine bağlayacak neden i arasında farklı bahsetmek hoşunuza gidebilir ... asla anlamayacak set -- $unset, set - $unset, set $unset, ve set "$unset"genellikle ilk etapta sorun bu tür insanları olsun bu tutarsızlıklar - ve böyle devam eder.
mikeserv

@mikeserv: Daha fazla ayrıntı ekledim, ama kullanıldığında ne demek istediğini anlamadım $unset.
cuonglm

@cuonglm Komut set $unset, setayarlanmamış bir değişkene tam olarak eşit şekilde çalışır . Ama aslında set "$unset" fark unsetedilmeyen bir değişkendir. A ve ayar seçeneklerini set - $unsetkaldırır (bash olarak). -v-x

@BinaryZebra: Ah, elbette benim için kullanmak daha iyi unset_var. Ve set "$unset"bunun aslında $1boş olarak ayarlandığını da unutmayın . Bu kabuk genişlemesi ile ilgili, kesinlikle değil set, bu yüzden bahsetmiyorum.
cuonglm

1
@mikeserv: poshve öğesinin davranışı göründüğünde yashfarklıdır -. Güncellememi okuyabilir (ve geliştirmekten çekinmeyin).
cuonglm

2

Bir bash kabuğunun içinde çalışıyorsanız yazın help set.

Basılan yardımın sonunda şunları okuyun:

Hiçbir ARG verilmezse, tüm kabuk değişkenleri yazdırılır.

Yani, hiçbir bağımsız setdeğişken kabuk tarafından bilinen tüm değişkenleri yazdırır.


set -x; set
Yardımcı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.