Cd komutuna bağlanabilir miyim?


9

Çalıştığım bir sunucuda bir şey kurmaya çalışıyorum, cdbir public_htmlklasöre her zaman% 95 zamanım her zaman belirli şeyleri kontrol etmek için çalışacağım birkaç komut var.

Yine de içine bir kanca cdvarsa, eğer bir dizin varsa, public_htmlotomatik olarak benim için komutları çalışacak?

cdKomuta giremezsem , peşimde olduğum sonuca ulaşmak için yapabileceğim başka şeyler var mı?

CentOS 5.8 kullanıyorum.

Yanıtlar:


12

Bu işlevi kendinize .bashrcveya başka bir başlangıç ​​dosyasına ekleyebilirsiniz (kabuğunuza bağlı olarak).

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

Ooh, bu ilginç görünüyor. Bunu benim .bash_profile dosyasına ekledim echo "Testing..."ve if, ancak nothings çıktısının hemen üstüne ekledim . Bu değişiklikleri uygulamak için bir şey yapmam gerekir mi?
TMH

@TomHart Yeni bir oturum başlatmadıysanız, dosyayı şu anki oturumunuza kaynaklamanız gerekir. ~/.bash_profile
UVV

@TomHart, CentOS'umda hiç yok gibi görünüyor /bin/cd, bu nedenle bu çözüm işe yaramayabilir
UVV

Bunu şimdi fark ettim. Neden unix.stackexchange.com/questions/116955/where-is-cd-located olduğunu belirten bu soruyu buldum . Hala bir / bin / cd olsa sistem için hala iyi bir çözüm :).
TMH

1
Eğer varsa Çalışmaz cd -P public_htmlya cd ~/public_htmlya mümkünse değil beklenmeyen davranışlara sahip cdiçine public_html.
Stéphane Chazelas

17

İle kshya da bash(ya da zsh):

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

İle zsh:

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

( chpwdBir olan kanca Geçerli çalışma dizini yoluyla (her değiştirdiğinde denir fonksiyonu cd, pushd, popd...)).


3

cdMevcut bir komut olan kaydırma tavsiye edilmez.

Daha evrensel bir çözüm chpwd, Bash'te özel bir kanca tanımlamak olacaktır . (Bu sorunun etiketlerine göre Bash kullandığınızı varsayıyorum)

Bash'te diğer modern mermilere kıyasla tasarlanmış tam bir kanca sistemi yoktur. PROMPT_COMMANDdeğişken, precmdbalıktaki ZSH'deki kancaya eşdeğer bir kanca fonksiyonu olarak kullanılır fish_prompt. Şimdilik, ZSH bir chpwdkanca yerleşikine sahip olduğunu bildiğim tek kabuk .

PROMPT_COMMAND

Ayarlanırsa, değer her birincil istemin ($ PS1) yazdırılmasından önce yürütülecek bir komut olarak yorumlanır.

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

chpwd Kanca Bash

Bash'te chpwdeşdeğer bir kanca ayarlamak için bir hile sağlanır 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}"

Biz algılıyoruz yana PWDdeğişikliği doğrudan, çözüm ile çalışır cd, pushdve popd.

Not : chpwdBash ve chpwdZSH'deki uygulamalarımız arasındaki temel fark , PROMPT_COMMANDetkileşimli olmayan bir Bash kabuğunda desteklenmemektedir.

kullanım

_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"

Kaynak: Benim gist Bash chpwd Eşdeğer Kanca oluşturun .

Herkes ZSH için bir cevap ister. chpwdZSH'de kanca kullanın . Fonksiyonu doğrudan tanımlamayın chpwd(). Daha fazla ayrıntı burada .


1

Ben bir bash uzmanı değilim ama @ UVV'nin cevabını alıp bunu yapmak için biraz değiştirebilirim:

  • yerine denetlenmesine yönelik public_html, sadece bazıları için kontrol ederdim hook-scripthedef dir dosya $1, derler cd_hook.sh.
  • bu hook-scriptvarsa, çalıştırın ve devam edin.cd

Bu daha genel görünmektedir, çünkü daha sonra cdisterseniz cd_hook.sh, söz konusu dizine bir a ekleyerek -hook'u herhangi bir dizine uygulayabilirsiniz .


3
Genel görünüyor, ancak bir güvenlik açığı sunuyoruz. Birisi ya da bir şey sadece / tmp içine bir kanca komut dosyası dikmek gerekir örneğin bir dahaki sefere cd cd herhangi bir kod çalıştırmak için. En azından hook komut dosyasının size ait olduğundan, senden başkası tarafından yazılamayacak bir symlink'e sahip olmadığından, içerdiği dizinin yalnızca sizin tarafınızdan yazılabildiğinden emin olmak istersiniz ... Bkz. Çalışma dizini başına geçmiş tutma (kabuk oturum başına bakınız) daha güvenli bir yaklaşım.
Stéphane Chazelas

@ StéphaneChazelas güvenlik anlayışı için teşekkürler. İtiraf etmeliyim ki bunu düşünmedim bile.
kayıp ve bulunan

Bu soruyu sadece bunu yaparken buldum: eğer bir cdyerde, bir .bashcddosyayı kontrol edin ve varsa çalıştırın.
DarkWiiPlayer

0

Bash'da güçlü zsh yaklaşımını kullanma:

İlk önce bash'ı genişletmenin kolay bir yolu:

~ / .Runscripts

#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 dosyasına dahil et:

. ~/.run_scripts

run_scripts ~/.bashrc.d

~ / .Bashrc.d / cdhook oluşturabilirsiniz:

#!/bin/bash

chpwd() {
  : #no action
}

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

Şimdi işlevi değiştirmek size kalmış:

#list files after cd
chpwd() {
  ls -lah --color
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.