Различный результат команды find при запуске из терминала и из скрипта bash

Обертывание cdсуществующей команды не рекомендуется.

Более универсальным решением было бы определение пользовательского хука chpwdв Bash. (Согласно тегам этого вопроса, я предполагаю, что вы используете Bash)

В Bash не существует законченной системы перехватчиков по сравнению с другими современными оболочками. Переменная PROMPT_COMMANDиспользуется как функция ловушки, которая эквивалентна ловушке precmdв ZSH, fish_promptв Fish. В настоящее время,ZSH — единственная известная мне оболочка со встроенным хуком chpwd.

PROMPT_COMMAND

If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1).

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables

chpwdКрюк в Баше

Предоставляется трюк для установки эквивалентного хука chpwdв Bash на основе PROMPT_COMMAND.

# create a PROPMT_COMMAND equivalent to store chpwd functions
typeset -g CHPWD_COMMAND=""

_chpwd_hook() {
  shopt -s nullglob

  local f

  # run commands in CHPWD_COMMAND variable on dir change
  if [[ "$PREVPWD" != "$PWD" ]]; then
    local IFS=$';'
    for f in $CHPWD_COMMAND; do
      "$f"
    done
    unset IFS
  fi
  # refresh last working dir record
  export PREVPWD="$PWD"
}

# add `;` after _chpwd_hook if PROMPT_COMMAND is not empty
PROMPT_COMMAND="_chpwd_hook${PROMPT_COMMAND:+;$PROMPT_COMMAND}"

Поскольку мы обнаруживаем изменение PWDнапрямую, решение работает с cd, pushdи popd.

Примечание.:Основное различие между нашей реализацией chpwdв Bash и chpwdв ZSH заключается в том, что PROMPT_COMMANDне поддерживается в интерактивной оболочке Bash, отличной от -.

Использование

_public_html_action() {
  if [[ $PWD == */public_html ]]; then
    # actions
  fi
}

# append the command into CHPWD_COMMAND
CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_public_html_action"

Источник:Создайте эквивалентный хук chpwd в Bash из моей сути.

Для тех, кто хочет получить ответ по ZSH. Используйте хук chpwdв ZSH. Не определяйте функцию chpwd()напрямую.Подробнее здесь .

0
29.07.2021, 12:16
0 ответов

Теги

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