Ecco alcune soluzioni alternative:
$ comm -3 <(declare | sort) <(declare -f | sort)
abbattersi:
declare
stampa ogni variabile definita (esportata o meno) e funzione.
declare -f
stampa solo funzioni.
comm -3
rimuoverà tutte le linee comuni ad entrambi. In effetti questo rimuoverà le funzioni, lasciando solo le variabili.
Per stampare solo variabili che non vengono esportate:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Un'altra soluzione alternativa:
$ declare -p
Questo stamperà solo le variabili, ma con alcuni brutti attributi.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Puoi tagliare gli attributi usando ... cut:
$ declare -p | cut -d " " -f 3
Un aspetto negativo è che il valore di IFS viene interpretato anziché visualizzato.
confrontare:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Questo rende abbastanza difficile usare quell'output per ulteriori elaborazioni, a causa di quel solitario "
in una riga. Forse un po 'di IFS-fu può essere fatto per evitarlo.
Ancora un'altra soluzione alternativa, usando compgen
:
$ compgen -v
Il built-in bash compgen
doveva essere usato negli script di completamento. A tal fine, compgen -v
elenca tutte le variabili definite. Il rovescio della medaglia: elenca solo i nomi delle variabili, non i valori.
Ecco un trucco per elencare anche i valori.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Il vantaggio: è una soluzione bash pura. Lo svantaggio: alcuni valori sono incasinati a causa dell'interpretazione printf
. Anche la subshell dalla pipe e / o dal loop aggiungono alcune variabili extra.