Временно объявить переменную в Bash

Попытайтесь освободить больше места для текста с помощью "text_buffer_size".

1
14.12.2018, 19:42
4 ответа

Конечно:

trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &

Это устанавливает ловушку для сигнала USR1, затем (обман с точкой с запятой, чтобы поместить его в одну строку )группирует команды сна и уничтожения в фоновом задании. Когда это задание завершится, оно отправит сигнал USR1 текущей оболочке, которая выполнит ловушку. Ловушка сбрасывается x, а затем очищается.

Нет функций!

7
27.01.2020, 23:10

Вы не можете использовать задания at, поскольку они выполняются в другом контексте и не могут повлиять на текущую оболочку.

Но мы можем сделать что-то подобное. Этот код вызовет сигнал тревоги, который мы можем поймать и выполнить действие на

.
#!/bin/bash

x=100

trap 'unset x' SIGALRM

mypid=$$

( /bin/sleep 3 ; kill -ALRM $mypid) &

for a in 1 2 3 4 5 6
do
  echo Now x=$x
  sleep 1
done

Этот пример длится всего 3 секунды, чтобы продемонстрировать решение; Вы можете выбрать задержку по мере необходимости.

В действии:

Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=

Вы можете легко сделать это одной строкой с помощью ;...

9
27.01.2020, 23:10

На самом деле самым простым способом может быть использование составной команды с объявлением переменной в начале.

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

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y bash -c 'echo $x'
y
madumlao@lezard:~$ echo $x
foo

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

Обратите внимание, что следующее не будет работать:

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y echo $x

madumlao@lezard:~$ echo $x
foo

Параметр $x во второй строке анализируется во время анализа строки команды -до фактического присвоения значения, поэтому он неожиданно оказывается пустым!

0
27.01.2020, 23:10

С вашим пересмотренным вопросом, основанным на командной строке, а не на скрипте, самым простым решением будет использование подоболочки для выполнения вашей работы.

например

$ bash
$ x=100
$ echo $x
100
$ exit
$ echo $x

$

Все переменные, которые вы установили между запуском bashи exitэтой оболочки, будут забыты.

Это очень похоже на то, как работает часть wget... | bash, за исключением того, что вы можете вырезать и вставлять/печатать команды.

2
27.01.2020, 23:10

Теги

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