ฉันขอเกี่ยวกับคำสั่ง 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, แต่ไม่ได้เอาท์พุท ฉันต้องทำอะไรเพื่อใช้การเปลี่ยนแปลงเหล่านี้หรือไม่
TMH

@TomHart หากคุณไม่ได้เริ่มเซสชันใหม่คุณต้องส่งไฟล์ไปยังเซสชันปัจจุบันของคุณโดย. ~/.bash_profile
UVV

@ TomHart ดูเหมือนว่าไม่มี/bin/cdใน CentOS ของฉันดังนั้นวิธีนี้อาจไม่สามารถใช้งานได้
UVV

ฉันเพิ่งสังเกตเห็นว่าตอนนี้ ผมพบว่าคำถามนี้ซึ่งระบุว่าทำไมunix.stackexchange.com/questions/116955/where-is-cd-located ยังคงเป็นทางออกที่ดีสำหรับระบบที่มี / 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ตัวแปรถูกใช้เป็นฟังก์ชั่น hook ซึ่งเทียบเท่ากับprecmdhook ใน ZSH fish_promptใน Fish ในขณะนี้ ZSH เป็นเปลือกเดียวที่ฉันรู้ว่ามีchpwdเบ็ดในตัว

PROMPT_COMMAND

หากตั้งค่าค่าจะถูกตีความเป็นคำสั่งให้ดำเนินการก่อนพิมพ์พรอมต์หลักแต่ละรายการ ($ PS1)

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

chpwd ตะขอในทุบตี

เคล็ดลับที่มีให้กับการติดตั้งตะขอเทียบเท่าในทุบตีอยู่บนพื้นฐานของchpwdPROMPT_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, และpushdpopd

หมายเหตุ : ความแตกต่างหลักระหว่างchpwdimplementaion ของเราใน Bash และchpwdใน ZSH PROMPT_COMMANDคือไม่ได้รับการสนับสนุนใน Bash shell ที่ไม่ต้องมีการโต้ตอบ

การใช้

_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 Equivalent Hook ใน Bashจากส่วนสำคัญของฉัน

สำหรับทุกคนที่ต้องการคำตอบสำหรับ ZSH ใช้chpwdเบ็ดใน ZSH อย่ากำหนดchpwd()ฟังก์ชั่นโดยตรง รายละเอียดเพิ่มเติมที่นี่


1

ฉันไม่ใช่ผู้เชี่ยวชาญทุบตี แต่ฉันจะตอบ @VVV และแก้ไขมันเพียงเล็กน้อยเพื่อที่จะทำสิ่งนี้:

  • แทนการตรวจสอบสำหรับpublic_htmlฉันต้องการเพียงแค่การตรวจสอบสำหรับบางhook-scriptไฟล์ใน dir เป้าหมาย$1, cd_hook.shพูดว่า
  • หากhook-scriptมีอยู่ให้เรียกใช้และดำเนินการต่อด้วยcd

สิ่งนี้ดูเหมือนจะเป็นเรื่องทั่วไปมากกว่าเพราะคุณจะสามารถใช้cd-hook กับไดเรกทอรีใดก็ได้ถ้าคุณเลือกโดยเพียงเพิ่มcd_hook.shในไดเรกทอรีดังกล่าว


3
ดูเหมือนทั่วไป แต่คุณกำลังแนะนำช่องโหว่ด้านความปลอดภัย บางคนหรือบางอย่างต้องการปลูกฝัง hook-script ใน / tmp เพื่อให้คุณเรียกใช้โค้ดใด ๆ ในครั้งต่อไปที่คุณ cd อย่างน้อยคุณต้องการให้แน่ใจว่าคุณเป็นเจ้าของ hook ไม่ใช่สคริปต์เชื่อมโยงหรือไม่สามารถเขียนได้โดยบุคคลอื่นที่ไม่ใช่คุณไดเรกทอรีที่อยู่ในนั้นสามารถเขียนได้โดยคุณเท่านั้น ... ดูการรักษาประวัติต่อไดเรกทอรีการทำงาน (cf. ต่อเชลล์เซสชั่น)สำหรับแนวทางที่ปลอดภัยยิ่งขึ้น
Stéphane Chazelas

ขอบคุณสำหรับข้อมูลเชิงลึกด้านความปลอดภัย @ StéphaneChazelas ฉันต้องยอมรับว่าไม่ได้คิดแม้แต่เรื่องนี้
หลงทางและพบ

ฉันพบคำถามนี้ในขณะที่ทำเช่นนั้น: ถ้าฉันcdอยู่ที่ไหนสักแห่งให้ตรวจสอบ.bashcdไฟล์และเรียกใช้ถ้ามันมีอยู่
DarkWiiPlayer

0

ใช้วิธี zsh ที่มีประสิทธิภาพในทุบตี:

วิธีแรกในการเพิ่ม bash:

~ / .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:

. ~/.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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.