D'une manière compatible posix qui fonctionne avec plusieurs implémentations, comment puis-je imprimer la liste des variables d'environnement actuellement définies sans leurs valeurs?
Sur certaines implémentations (mksh, freebsd / bin / sh), le simple fait d'utiliser export
seul suffira:
$ export
FOO2
FOO
Mais pour certaines autres implémentations (bash, zsh, dash), export
affiche également la valeur. Avec bash, par exemple:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
D'autres options comme env
ou printenv
n'ont pas d'options pour imprimer uniquement les noms de variables sans valeurs, du moins pas sur les plates-formes Linux et FreeBSD que j'ai essayées.
Tuyauterie vers awk / sed / etc. ou rogner la liste avec des techniques d'expansion de paramètres (par exemple, ${foo%%=*}
) est acceptable, mais il doit fonctionner avec des valeurs qui peuvent s'étendre sur des lignes et avoir des =
espaces dans la valeur (voir l'exemple ci-dessus).
Les réponses spécifiques à des implémentations de shell particulières sont intéressantes, mais je recherche principalement quelque chose de compatible entre les implémentations.
export -p
spécifiée par POSIX pour générer une sortie qui convient également à l'entrée dans le shell.export -p
pour cela?export -p
parce que cela vous donnerait une sortie cohérente sur tous les shells POSIX, ce que vous avez dit vouloir.export -p
ne correspond pas à la première exigence - imprimer uniquement les noms de variables sans valeurs.export -p
. Je ne vais pas écrire cette analyse, car dans le cas général, il faudrait également effectuer une analyse des guillemets appropriée, au cas où vous auriez une variable dont la valeur ressemble à quelque chosehello\nexport var=value
. L'une des rares autres commandes qui vous donnera une sortie cohérente dans tous les shells POSIX estenv
, mais cette sortie est plus difficile à analyser car elle manque leexport =
bit.Réponses:
C'est assez facile en awk.
Cependant méfiez - vous des implémentations de awk ajouter des variables d' environnement de leur propre (par exemple GNU awk ajoute
AWKPATH
etAWKLIBPATH
àENVIRON
).La sortie est ambiguë si le nom d'une variable d'environnement contient une nouvelle ligne, ce qui est extrêmement inhabituel mais techniquement possible. Une solution pure sh serait difficile. Votre meilleur pari est de commencer
export -p
mais le masser en pure sh est difficile. Vous pouvez utiliser sed pour masser la sortie deexport -p
, puis utilisereval
pour obtenir la coque pour supprimer ce qu'elle a cité. Bash et zsh impriment des préfixes non standard.Notez que selon le shell,
export -p
peut ou peut ne pas afficher les variables dont le nom n'est pas valide dans le shell, et si ce n'est pas le cas, il peut ou non citer les noms correctement. Par exemple, dash, mksh et zsh omettent les variables dont le nom inclut une nouvelle ligne, BusyBox dash et ksh93 les affichent brutes et bash les imprime brutes sans leur valeur. Si vous devez vous défendre contre des entrées non fiables, ne vous fiez pas à une solution POSIX pure et n'appelez certainementeval
rien de ce qui dérive de la sortie deexport -p
.la source
exit
soit nécessaire).FOO<newline>BAR
, vous ne savez pas s'il s'agit d'uneFOO<newline>BAR
variable d'environnement (quiexport -p
ne s'afficherait pas avec la plupart des shells, voirenv $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}'
) ou à la fois d'une variable d'environnementFOO
etBAR
.awk
définit ses propres variables d'environnement (AWKPATH
etAWKLIBPATH
sur mon système)J'aime les choses simples; cela fonctionnera pour les systèmes POSIX:
la source
export AAA=$'multi\nBBB=line'
compgen -e
. Cela n'aide pas pour mes scripts portables (par exemple, quand bash n'est pas disponible), mais c'est intéressant.dash
Debian, j'obtiens les mêmes résultats avec la commande ci-dessus ou, la modifiéeprintenv | sed 's;*=.;;' | sort
pour obtenir les valeurs. J'ai exporté la variableyo
et lui ai attribué votre premier commentaire ci-dessus; il a imprimé comme prévu, avec plusieurs lignes. Je ne sais pas ce que vous vivez, mais il ne devrait pas y avoir de sortie tronquée. exécutez la commande dans le shell; quoi qu'il produise il y a comment cela devrait fonctionner; ne vous attendez pas à la tronquer. Ensuite, dans le cadre de TERMCAP / screen / iirc; devrait être le même. Si la sortie ne correspond pas, c'est probablement un problème avec l'un de ces programmes.