Чи можу я підключитися до команди CD?


9

Я намагаюся налаштувати щось на сервері, на якому я запускаю, коли коли-небудь я cdпотрапляю в public_htmlпапку в 95% часу, є кілька команд, які я завжди запускаю, щоб перевірити певні речі.

Чи все-таки я можу підключитися до cdцього, якщо каталог - це public_html, він автоматично запускає команди для мене?

Якщо я не можу підключитися до cdкоманди, чи є ще якісь речі, які я міг би зробити, щоб досягти результату, за яким я домагаюся?

Я працюю CentOS 5.8.

Відповіді:


12

Ви можете додати цю функцію у свій .bashrcабо інший файл запуску (залежно від оболонки).

cd() {      
   if [ "$1" = "public_html" ]; then
      echo "current dir is my dir"
   fi
   builtin cd "$1"
}

О, це виглядає цікаво. Я додав це до мого .bash_profile і додав echo "Testing..."трохи вище, ніж результат if, але nothings. Чи потрібно щось робити, щоб застосувати ці зміни?
TMH

@TomHart Якщо ви не розпочали нову сесію, вам доведеться джерело файлу в поточному сеансі до. ~/.bash_profile
UVV

@TomHart, схоже, /bin/cdу моєму CentOS немає, тому це рішення може не працювати
UVV

Я щойно це помітив. Я знайшов це питання, в якому йдеться про те, чому unix.stackexchange.com/questions/116955/where-is-cd-location . Все-таки гарне рішення для системи, яка насправді має / bin / cd, хоча :).
TMH

1
Не працює, якщо ви cd -P public_htmlчи не маєте cd ~/public_htmlнесподівану поведінку, якщо не можете cdвступити public_html.
Stéphane Chazelas

17

З kshабо bash(або zsh):

cd() {
  builtin cd "$@" || return
  [ "$OLDPWD" = "$PWD" ] || case $PWD in
      (*/public_html) echo do something
    esac
}

З zsh:

chpwd()
  case $PWD in
    (*/public_html) echo do something
  esac

( chpwdЦе гачок функція, яка викликається всякий раз , коли поточний робочий каталог змінюється (по шляху cd, pushd, popd...)).


3

Обтікання cd, існуюча команда, не рекомендується.

Більш універсальним рішенням було б визначення користувацького chpwdгачка в Bash. (Відповідно до тегів цього питання, я припускаю, що ви використовуєте Bash)

Не існує повної системи гаків, розробленої в Bash, порівняно з іншими сучасними мушлі. PROMPT_COMMANDзмінна використовується як функція гака, що еквівалентно precmdгачку в ZSH, fish_promptу Fish. На даний момент ZSH є єдиною відомою мені оболонкою, яка має chpwdвбудований гачок.

PROMPT_COMMAND

Якщо встановлено, значення інтерпретується як команда для виконання перед друком кожного основного запиту ($ 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 і chpwdZSH полягає в тому, що 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()функцію безпосередньо. Детальніше тут .


1

Я не баш експерт, але я б прийняв відповідь @ UVV і змінив її лише трохи, щоб це було так:

  • замість перевірки public_html, я б просто перевірити який - то hook-scriptфайл в цільової директорії $1, скажімо, cd_hook.sh.
  • якщо це hook-scriptіснує, запустіть його та продовжуйте роботу зcd

Це здається більш загальним, оскільки ви зможете застосувати cd-hook до будь-якого каталогу, якщо захочете, просто додавши cd_hook.shу вказаний каталог.


3
Це здається загальним, але ви представляєте вразливість безпеки. Хтось або щось потрібно, наприклад, встановити скрипт з гачками в / tmp, наприклад, щоб змусити вас запустити будь-який код наступного разу, коли ви введете його. Ви хоч хочете, щоб переконатися, що скрипт гака належить вам, а не посилання, яке не можна записувати будь-яким іншим, крім вас, що каталог, у якому ви перебуваєте, записується лише ви ... Див. Зберігання історії за робочою директорією (пор. на сеанс оболонки) для більш безпечного підходу.
Стефан Шазелас

Дякуємо за огляд безпеки @ StéphaneChazelas. Треба визнати, що я навіть не думав про це.
втрачено-знайдено

Я знайшов це питання, роблячи саме так: якщо я cdдесь, перевірте .bashcdфайл і запустіть його, якщо він існує.
DarkWiiPlayer

0

Використання потужного підходу zsh в bash:

Перший простий спосіб продовжити баш:

~ / .рукописи

#load all scripts inside $1 dir

run_scripts()
{
    for script in $1/*; do

        # skip non-executable snippets
        [ -f "$script" ] && [ -x "$script" ] || continue

        # execute $script in the context of the current shell
        . $script
    done
}

Включити до .bashrc:

. ~/.run_scripts

run_scripts ~/.bashrc.d

Ви можете створити ~ / .bashrc.d / cdhook за допомогою:

#!/bin/bash

chpwd() {
  : #no action
}

cd() {      
   builtin cd $1
   chpwd $1
}

Тепер замінити функцію:

#list files after cd
chpwd() {
  ls -lah --color
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.