Как добавить значение к выводу команды cat без изменения файла?

Если вы хотите, чтобы подстановочные знаки отключались только в то время, когда оболочка интерпретирует код в 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оказывается включенной спустя долгое время после того, как эта команда была оценена. Для этого см. мой другой ответ(ответ на другой вопрос ).

0
10.12.2019, 17:36
1 ответ

Вы хотите направить выходные данные обеих команд как группу в окончательный сценарий, а не выходные данные 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
3
28.01.2020, 02:21

Теги

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