1

Я обнаружил, что в Bash я часто использую что-то вроде этого:

  • vim ./somefile1 меньше
  • меньше ./dir1/dir2/somefile2
  • cp some_other_relative_path_to_file

и так далее

После этого, когда я пытаюсь найти команду в истории и запустить ее, я получаю сообщение об ошибке, потому что сейчас я нахожусь в другом каталоге. Можно ли настроить bash для "расширения" относительного пути к файлам с абсолютным, когда они идут в историю?

1 ответ1

1

Одним из решений будет переписать историю так, чтобы при запуске это:

ls

он сохраняется как:

cd /current/directory && ls

Для Bash есть хитрость для изменения его истории, как объясняется в этом великолепном ответе stackoverflow. Вам нужно будет использовать переменную оболочки Bash с именем PROMPT_COMMAND .

Если установлено, его содержимое выполняется каждый раз перед отображением подсказки. Установка этого к этому:

export PROMPT_COMMAND='hcmd=$(history 1); hcmd="${hcmd# *[0-9]*  }"; if [[ ${hcmd%% *} == "cd" ]]; then pwd=$OLDPWD; else pwd=$PWD; fi; hcmd=$(echo -e "cd $pwd && $hcmd"); history -s "$hcmd"'

перепишет историю, как описано выше.

Попробуйте сначала в окне терминала, и если вам это нравится, добавьте его в файл .bashrc чтобы включить его.

Недостатком является то, что в текущем воплощении все команды будут иметь префикс cd /some/dir , что снижает удобочитаемость и может раздражать такие команды, как cd /usr/local:

$ history | tail -n 5
  522  cd /Users/jaume && cd /usr/local
  523  cd /usr/local && file bin/ls
  524  cd /usr/local && cd ~
  525  cd /Users/jaume && file Documents/.localized 
  526  history | tail -n 5

Конечно, вы можете изменить PROMPT_COMMAND чтобы переписывать историю только для уменьшенного числа команд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .