2012-05-18 5 views
0

Я просто думаю, что мне удобно «cd» в каталог, где я храню некоторый файл, т.е.Настроить «cd» в bash

[[email protected] /]$ cd /usr/bin/somefile.pl 

, насколько я знаю, что официальная команда «cd» не будет работать.

, так что я написал что-то вроде этого:

main() { 
    if [[ "${1}" =~ "(.+/)*(.*){1}" ]] && [ -f "${1}" ] ; then 
      `\cd ${1%/*}` 
    elif [ -f "${1}" ] ; then 
      exit 0 
    else ; `\cd ${1}` 
    fi 
} 
main ${1} 

и я псевдоним этого cd.sh к команде "CD":

alias cd='source /somepath/cd.sh' 

и это не работает.

Я пытался использовать eval "\cd xxx" вместо \cd xxx;

Как исправить мой сценарий?

+0

Чувак, это сладкая идея. Но, пожалуйста, используйте 'basename' для управления путями, а не регулярными выражениями. –

+0

, потому что когда-то я просто хочу посмотреть, какие файлы хранятся с файлом, я смотрю на lol, когда я знаю путь абзаца этого файла. –

ответ

3

Такое ощущение, что это плохая идея, чтобы переопределить cd, поэтому я предлагаю немного другую команду, fcd:

fcd() { cd -- "$(dirname -- "$1")"; } 

$ fcd /usr/bin/somefile.pl 
$ pwd 
/usr/bin 

Или с помощью расширения параметров, чтобы сохранить вызов dirname:

fcd { cd -- "${1%/*}"; } 
+0

спасибо! я не знал, что могу получить имя dir, используя dirname ... –

+0

Он на самом деле не переопределил 'cd' – KurzedMetal

+0

+1: нужны дополнительные кавычки' fcd() {cd "$ (dirname" $ ​​1 ")"; } 'в случае, если имя каталога содержит пробелы. –

0
cd() { 
    DN="$(dirname "$1")" 
    if [[ -d "$1" ]]; then 
     builtin cd "$1" 
    elif [[ -d "$DN" ]]; then 
     builtin cd "$DN" 
    else 
     echo "$* or $DN: No such directories" 
     return 1 
    fi 
    return 0 
} 
+0

Почему '' $ * "'? Есть ли какой-нибудь случай, когда принимать несколько аргументов командной строки и смешивать их вместе в один с первым символом «$ IFS» вкрапленными, будет правильным? –

+1

Также рассмотрите возможность замены '' $ (dirname "$ foo") '' вызова с расширением параметра, т.е. '' $ {foo%/*} "' - это не требует подоболочки и, таким образом, будет работать намного лучше. –

+0

@CharlesDuffy Настоящий 'cd' рассматривает все свои параметры как один, поэтому кому это нужно. Если вы попробуете 'cd one two' (без кавычек)' cd' будет пытаться подключиться к директории 'one two' (с пробелом) – KurzedMetal

Смежные вопросы