/usr/libexec/locate.updatedb
en mi sistema (una variante BSD )no parece tener las opciones que sugiere A.B. En cambio, lo hace:
: ${FCODES:=/var/db/locate.database}
: ${SEARCHPATHS:="/"}
Así que tuve que hacer esto:
export SEARCHPATHS=$HOME
export FCODES=$HOME/locatedb
/usr/libexec/locate.updatedb
Entonces:
$ locate -d ~/locatedb <pattern>
¿Hay alguna forma de evitar establecer variables de entorno en mi sistema?
Предполагая, что вы используете bash
, вы можете легко сделать это с помощью косвенной ссылки:
$ foo=bar
$ bar=magicword
$ printf "%s\n" "${!foo}"
magicword
Синтаксис$var
(или${var}
)дает содержимое переменной var
.
Синтаксис ${!var}
дает содержимое переменной , названной вvar
.
Предполагая, что вы используете оболочку bash
:
$ source./file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ echo "${!var}"
ABCDEF
Используя ${!var}
, вы используете косвенную переменную в bash
. Значение переменной var
используется для получения имени расширяемой переменной.
В bash
вы также можете использовать переменную ссылки на имя:
$ source./file
$ echo "$VAR1"
ABCDEF
$ declare -n var="VAR1"
$ echo "$var"
ABCDEF
Здесь переменная var
относится к переменной VAR1
, поэтому $var
будет расширяться до того, до чего расширяется $VAR1
.
Ссылки на имена изначально являются функцией ksh
, и в этой оболочке они объявляются с помощью typeset -n
.
Ссылки на имена чрезвычайно полезны для передачи ссылок на массивы при вызовах функций оболочки.
В любой sh
оболочке:
$../file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ eval "echo \"\$$var\""
ABCDEF
Утилита eval
принимает строку, которую она повторно -оценивает. Здесь мы даем ему строкуecho "$VAR1"
(после расширения$var
).
Проблема с eval
заключается в том, что с ним легко внести ошибки или уязвимости, небрежно создав строку аргумента.