Если вы хотите, чтобы подстановочные знаки отключались только в то время, когда оболочка интерпретирует код в any.sh
, с оболочками на основе bash4.4+
или ash
-, вы можете сделать:
x() {
local -
set -o noglob
. any.sh
}
Или вzsh
:
x() {
set -o localoptions -o noglob
. any.sh
}
То есть используйте функцию вместо псевдонима (вы не хотите использовать псевдонимы для нескольких команд, так как это не делает то, что вы хотите, когда вы делаете cmd | x
или cmd && x
, например ), убедитесь, что изменения параметров (в переменной $-
как один из способов взглянуть на нее )являются локальными для функции, отключите glob и источник файла.
В старых версиях bash
можно было:
x() {
local ret restore
[[ $- = *f* ]] || restore='set +o noglob'
set -o noglob
. any.sh
ret=$?
eval "$restore"
return "$ret"
}
Или, может быть, более общая вспомогательная функция, такая как:
withopt() {
local ret option
local -a restore
option=$1; shift
[[ -o $option ]] || restore=(set +o "$option")
set -o "$option"
"$@"
ret=$?
"${restore[@]}"
return "$ret"
}
Затем вы можете использовать псевдоним, если хотите:
alias x='withopt noglob. any.sh'
Обратите внимание, что это не предотвращает расширение *
, если вы делаете:
x *
Поскольку опция noglob
оказывается включенной спустя долгое время после того, как эта команда была оценена. Для этого см. мой другой ответ(ответ на другой вопрос ).
Вы хотите направить выходные данные обеих команд как группу в окончательный сценарий, а не выходные данные echo
в cat
. Так что сгруппируйте эти команды, используя {...; }
или (...)
:
{ echo 'use database'; cat create_tables.sql; } | work_send_command_to_db.sh
Или:
( echo 'use database'; cat create_tables.sql ) | work_send_command_to_db.sh