Kludgy, bash -единственное решение:
(setn(){
set | sed '/^{/,/^}/d;/=/!d;/^BASH[A-Z_]*=\|^PPID=\|^SHLVL=\|^PIPESTATUS=\|^HISTSIZE=\|^HISTFILESIZE=\|^_[a-z_]*=/d' | sort
}
export -f setn
comm -23 <(setn) <("$BASH" -ic setn))
Возможно, вам придется также отфильтровать другие переменные с помощьюsed
(или сделать шаблон BASH..
более строгим ). Предполагается, что /_[a-z_]*=/
исключает переменные, определяемые программируемым завершением, например _backup_glob
или _xspecs
; это тоже можно было бы сделать более строгим.
bash
выведет значения переменных, содержащих забавные символы, в формате $'...'
, так что вам придется обработать это:
foo='
bar
baz
'
...
foo=$'\nbar\nbaz\n'
bash
не будет создавать переменные оболочки из envvar, чьи имена содержат символы новой строки, поэтому такой трюк не может сломать этот хак.
В Ubuntu могут возникнуть проблемы со звуком.. если это еще не сделано, попробуйте использовать следующее:
sudo apt install pulseaudio