Как печатать переменные и значения оболочки для их копирования и вставки?

В Bash 4.2.25 вывод set и env не экранируется, поэтому оболочка выходит из строя, и любые непечатаемые символы не будут копироваться. Возьмем, к примеру, этот сеанс оболочки:

 $ export foo=$'a\nbar=\baz' $ env | grep -A 1 foo foo=a baraz 

То же, например, цвета – они печатаются буквально и могут испортить терминал. Как вы печатаете все переменные с их значениями таким образом, чтобы результат можно было скопировать и вставить, чтобы дать одну и ту же среду? *

* Очевидно, со стандартными предостережениями о переменных только для чтения, специальных переменных, таких как $_ и т. П.

2 Solutions collect form web for “Как печатать переменные и значения оболочки для их копирования и вставки?”

Вы можете сделать:

 printvars() ( eval 'declare() { printf declare; printf " %q" "$@"; echo; }'" $(declare -p)" ) printvars 

Это можно было бы легко расширить, чтобы опустить переменные только для чтения, такие как:

 printvars() ( eval 'declare() { [[ $1 = *r* ]] && return printf declare; printf " %q" "$@"; echo }'" $(declare -p)" ) 
 escaped_env() { cat /proc/self/environ | while IFS== read -r -d '' name value do printf '%s=%q\n' "$name" "$value" done } 

Пример сеанса:

 $ export foo=$'a\nbar=\baz' $ escaped_env | grep foo foo=$'a\nbar=\baz' 

Это работает, но только для export переменных, а set не имеет опции ␀-separator.

FYI, файловая система / proc не является функцией POSIX.1-2008 , и похоже, что только Linux реализует /proc/self/environ . Если ваша ОС не имеет этого файла, вы можете использовать env --null перед трубой.

  • Выделите escape-символы Vim, например \ n
  • Сценарий Bash для создания скрипта со встроенными значениями
  • Найдите комбинацию клавиш терминала OS X / escape-последовательность для Ctrl-
  • Независимость от оболочки для строк в скриптах
  • Программно определить escape-код ANSI, поддерживаемый терминалом
  • Как избежать метасимволов для egrep, как метакод из Perl?
  • Сохранение вывода команды в переменную в bash приводит к тому, что «Unescaped left brace in regex устарела»
  • можно ли отправить управляющую последовательность в эмулятор терминала с помощью клавиатуры
  • Что означают \ t и \ a в сценарии оболочки?
  • Как использовать ESC-последовательности, чтобы сделать область прокрутки терминала
  • Можно ли использовать коды escape-кода ANSI в Bash здесь-документах?
  • Linux и Unix - лучшая ОС в мире.