Определите переменную bash для оценки каждый раз, когда она используется - PullRequest
0 голосов
/ 17 января 2019

Я хочу определить bash переменную, которая будет оцениваться каждый раз, когда она используется.

Моя цель - определить две переменные:

A=/home/userA
B=$A/my_file

Поэтому, когда я обновляю A, B будет обновляться с новым значением A Я знаю, как сделать это в переменных приглашения, но есть ли способ сделать это для обычных переменных?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Нет. Вместо этого используйте простую и надежную функцию:

b() {
  echo "$a/my_file"
}

a="/home/userA"
echo "b outputs $(b)"

a="/foo/bar"
echo "b outputs $(b)"

Результат:

b outputs /home/userA/my_file
b outputs /foo/bar/my_file

Тем не менее, вот один уродливый способ борьбы с системой для дословного достижения вашей цели:

# Trigger a re-assignment after every single command
trap 'b="$a/my_file"' DEBUG

a="/home/userA"
echo "b is $b"

a="/foo/bar"
echo "b is $b"

Результат:

b is /home/userA/my_file
b is /foo/bar/my_file
0 голосов
/ 17 января 2019

Если у вас Bash 4.4 или новее, вы можете (ab) использовать расширение ${<i>parameter</i>@P} , которое расширяет parameter, как если бы это была строка приглашения:

$ A='/home/userA'
$ B='$A/my_file'      # Single quotes to suppress expansion
$ echo "${B@P}"
/home/userA/my_file
$ A='/other/path'
$ echo "${B@P}"
/other/path/my_file

Однако, как указано в комментариях, гораздо проще и удобнее использовать функцию:

$ appendfile() { printf '%s/%s\n' "$1" 'my_file'; }
$ A='/home/user'
$ B=$(appendfile "$A")
$ echo "$B"
/home/user/my_file
$ A='/other/path'
$ B=$(appendfile "$A")
$ echo "$B"
/other/path/my_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...