Сохранение массива в качестве переменной среды в неинтерактивной оболочке

grep -a может работать:

из man grep:

-a, --text equivalent to --binary-files=text

напр.grep -a -n "demodulator_process" 2018_12_22_13_04_adfags-modem.log

В качестве альтернативы вы можете удалить нулевые символы перед поиском, чтобы файл не рассматривался как двоичный файл. (Это не изменит файл, а только изменит содержимое для поиска ).

cat 2018_12_22_13_04_adfags-modem.log | tr -d '\000' | grep "demodulator_process"

-1
26.02.2021, 15:23
1 ответ

Do I have to move the Arch partition

Да, размер раздела нельзя изменить влево, поэтому вам нужно переместить его в начало свободного места, а затем изменить его размер. GParted может это сделать, используйте опцию Раздел → Изменить размер/переместить . Эту операцию нельзя выполнить на смонтированной файловой системе, вам нужно использовать LiveCD. Это займет некоторое время, потому что все данные в разделе необходимо переместить, но в остальном это не сложная задача с GParted. Как всегда при работе с хранилищем, рекомендуется делать резервную копию ваших данных.

-121 ---256463 ​​-

Переменные окружения представляют собой простые пары значений ключей -строк. Массив не может быть переменной окружения.

Однако вы можете передать значения вашего массива aв скрипт bash -c:

bash -c 'printf "%s\n" "$@"' bash "${a[@]}"

или, если вы хотите вызвать массив bв скрипте:

bash -c 'b=( "$@" ); printf "%s\n" "${b[@]}"' bash "${a[@]}"

В обоих этих случаях элементы массива aпередаются в командной строке скрипта. Это означает, что они будут отображаться в"$@""$1", "$2"и т. д. )внутри вашего скрипта bash -c.

В вашем вопросе происходит то, что команда

a=('Apple Tomato' 'Banana Carrot') bash -c '...'

устанавливает переменную aв строку (Apple Tomato Banana Carrot). Это значение переменной окружения aв скрипте bash -c:

.
$ a=('Apple Tomato' 'Banana Carrot') bash -c 'printf "%s\n" "$a"'
(Apple Tomato Banana Carrot)

Если вам действительно нужно передать данные как переменную окружения, вы можете сделать это, выбрав разделитель и затем объединив массив в одну строку.

Например, используя:

IFS=:
b="${a[*]}" bash -c 'set -f; IFS=:; a=( $b ); printf "%s\n" "${a[@]}"'

При этом создается строка Apple Tomato:Banana Carrotи создается переменная среды bс этой строкой в ​​качестве значения для сценария bash -c.

Затем этот сценарий снова разделяет bна :и присваивает разделенные слова своему собственному массиву a.

Мне нужно использовать set -fв скрипте, чтобы избежать вызова подстановки имени файла в разделенных словах при использовании $bбез кавычек.

Затем вы также захотите восстановить исходное значение IFSкак в bash -c, так и в родительской оболочке (вы можете сохранить старое значение в переменной, чтобы упростить эту задачу ). Вы также можете снова включить подстановку имен файлов в скрипте bash -cс помощью set +f.

ifs=$IFS; IFS=:
b="${a[*]}" bash -c 'set -f; ifs=$IFS; IFS=:; a=( $b ); IFS=$ifs; unset ifs; set +f; printf "%s\n" "${a[@]}"'
IFS=$ifs; unset ifs
5
18.03.2021, 22:28

Теги

Похожие вопросы