Cosa fa set command senza argomenti?


22

Cosa fa il setcomando senza argomenti?

Come posso vedere, stampa le mie variabili d'ambiente proprio come il envcomando ma in ordine alfabetico. E inoltre stampa alcune informazioni diverse (variabili? Funzioni?) Come:

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

Che cos'è e da dove viene?

Non riesco a trovare informazioni sul setcomando senza argomenti. In realtà non ho alcuna manpagina setnella mia distribuzione Linux.


1
"Questo built-in è così complicato che merita una sua sezione." Vedi i documenti
galath,

Risposte:


17

set è una shell integrata che visualizza tutte le variabili della shell, non solo quelle dell'ambiente, e anche le funzioni della shell, che è ciò che si vede alla fine dell'elenco.

Le variabili vengono visualizzate con una sintassi che consente di impostarle quando le linee vengono eseguite o acquisite.

Dalla bash pagina del manuale :

Se non vengono fornite opzioni o argomenti, set visualizza i nomi e i valori di tutte le variabili e funzioni della shell, ordinate in base alla locale corrente, in un formato che può essere riutilizzato come input per l'impostazione o il ripristino delle variabili attualmente impostate.

Su shell diverse, il comportamento non è necessariamente lo stesso; ad esempio, ksh setnon visualizza le funzioni della shell.


3
Questo perché kshnon memorizzare la definizione della funzione nella variabile shell.
cuonglm,

2
@cuonglm Una saggia decisione progettuale presa da dgk! ;-)
jlliagre,

7

Perché setha un output e which setnon restituisce nulla che tu sappia che fa parte della shell che stai usando, probabilmente bash.

man bash lo menziona molte volte ma è più facile collegarsi alla documentazione online .

Questo built-in è così complicato che merita una sua sezione. set consente di modificare i valori delle opzioni della shell e impostare i parametri posizionali o di visualizzare i nomi e i valori delle variabili della shell.

set ha la specifica di chiamata di:

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

quindi se vuoi trovarlo in man dalla riga di comando puoi cercare con

/set.*abef

which setdipende dalla tua shell. Almeno zshlo segnalerà per te. Puoi anche leggere questo per maggiori dettagli.
cuonglm,

È improbabile che la domanda riguardi tutto tranne che bash in quanto ha un ampio dominio sul mercato e chiunque utilizzi la shell non predefinita non dovrebbe porre questa domanda.
user1133275,

6

setè una shell incorporata , utilizzata per impostare e disinserire opzioni di shell e parametri posizionali.

Senza argomenti, setverranno stampate tutte le variabili shell (sia variabili d'ambiente che variabili nella sessione corrente) ordinate nella locale corrente .

Puoi anche leggere la documentazione di bash .


Ci sono alcuni avvertimenti.

set "$var"assegnerà varvalore a $1. Se $varinizia con -o +, il $varcontenuto è stato trattato come una sequenza di opzioni di shell. Se $varcontengono opzioni non valide, la maggior parte delle shell POSIX stamperà l'errore. yashe zshin sh, l' kshemulazione non solo stampa l'errore, ma imposta anche opzioni valide. Mentre yashinterrompi l'impostazione delle opzioni sulla prima opzione non valida, zshle assegnerai tutte. In yash:

var=-fxd; set "$var"

fe xpresenterà $-, mentre:

var=fdx; set "$var"

fpresente solo in $-. In entrambi i casi, fe xsi presenterà $-con zshin shed kshemulazione.

Per proteggerti da quella situazione, puoi passare --come primo argomento per impostare il parametro posizionale anche se inizia con -o +:

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

assegnerà $vara $1, indipendentemente dal suo contenuto.

set -- senza ulteriori argomenti disinserirà tutti i parametri posizionali.

Se il primo argomento è -, il comportamento non è specificato. Tutte le shell POSIX note verranno disattivate xe le vopzioni (tranne posh) e assegneranno qualsiasi cosa dopo -ai parametri posizionali:

set -xv - -f

assegnerà -fa $1. set -inoltre non ha annullato i parametri posizionali. Anche Schily osh si comporta così. Heirloom sh non viene disattivato ve le xopzioni.

L'unica eccezione alla shell POSIX è yash, che considera -il primo parametro posizionale:

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

Schily sh non fa nulla se -presente negli argomenti:

$ 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

Non ho mai capito perché la gente avrebbe collegare ovunque, ma il primo ... come si potrebbe parlare della differenza tra set -- $unset, set - $unset, set $unset, e set "$unset"e così via - di solito quelle discrepanze che convincere la gente in quel tipo di problemi, in primo luogo.
Mikeserv,

@mikeserv: Beh, ho aggiunto ulteriori dettagli, ma non ho capito cosa intendi quando usato $unset.
cuonglm,

@cuonglm Il comando set $unsetagirà esattamente come setper una variabile non impostata. Ma set "$unset" noterà, se in unsetrealtà è una variabile non impostata. A set - $unsetrimuove le opzioni -ve -ximposta (in bash).

@BinaryZebra: Ah, certo, per me, è meglio usarlo unset_var. E nota anche che in set "$unset"realtà è impostato $1su vuoto. Riguarda l'espansione della shell, non strettamente set, quindi non ne parlo.
cuonglm,

1
@mikeserv: il comportamento di poshe yashsono diversi quando -appaiono. Puoi leggere il mio aggiornamento (e sentirti libero di migliorarlo).
cuonglm,

2

Se stai lavorando all'interno di una shell bash, digita help set.

Alla fine dell'aiuto stampato, leggi:

Se non viene fornito alcun ARG, vengono stampate tutte le variabili della shell.

Quindi, nessun argomento setstampa tutte le variabili note alla shell.


Mi chiedo se set -x; setsarebbe utile
ILMostro_7,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.