2010-11-22 3 views
1

J'utilise cette petite fonction dans mon bashrc pour voir rapidement la source d'un utilitaire personnalisé que j'utilise:Comment puis-je modifier le répertoire de destination du fichier à l'aide d'une fonction bashrc?

function wvi() 
{ 
    vi `which $1`; 
} 

Par exemple, fvi mysort ouvrira la source de mon utilité mysort.

Il ya encore une chose que je peux utiliser ici - basculant automatiquement vers le répertoire dans lequel cet utilitaire est présent dans.

Par exemple,

~ $ which mysort 
/usr/bin/mysort 
~ $ 

alors fvi mysort devrait faire un cd /usr/bin puis ouvrez à l'aide vi.

Comment puis-je mettre cette logique dans mon .basrhc? Y a-t-il une utilité directe pour cela, ou dois-je d'abord obtenir le chemin, puis couper le dernier nœud?

Répondre

2
dirname `which mysort` 
+0

Quelle est la bonne façon d'écrire 'cd \' dirname \ 'qui mysort \' '? Je pense que l'imbrication n'est pas autorisée – Lazer

+0

@Lazer cd $ (dirname' \ 'qui mysort \' ') - peut être une solution – shuvalov

+3

J ust utiliser '$()' pour les deux: 'cd $ (dirname $ (quel monstre))' –

0
wvi() { 
    local file="$(which "$1")" 
    cd $(dirname "$file") 
    vi $(basename "$file") 
    cd - # return to the previous dir 
} 

Vous n'avez pas besoin du mot-clé function lorsque vous définissez votre fonction avec ()

Vous pouvez écrire votre fonction pour fonctionner dans un sous-shell afin que vous n'avez pas à ranger après:

wvi() (
    file="$(which "$1")" 
    cd $(dirname "$file") 
    vi $(basename "$file") 
) 
0
cd $(dirname `which $1`) 

fonctionnera dans la plupart des cas, bien que vous pouvez expliquer liens symboliques en enfermant quelque chose comme

cd $(dirname $(readlink `which $1`)) 

si une instruction if (l'option -h de la commande interne de test cherche des liens symboliques)

if [ -h `which $1 ]; then 
    ... 

La raison pour laquelle vous pouvez faire est que le comportement de vim change parfois lors de l'ouverture de liens symboliques, en fonction de ce que vous avez l'intention de faire avec le fichier en cours d'ouverture.

1

Pas besoin de services externes:

fvi() { 
    cd "${1%/*}" 
    vi "${1##*/}" 
} 
+0

Pouvez-vous expliquer le '$ s' final? Cela ne devrait-il pas être '$ {1%/*}; $ {1 ##/* /} '? – Sorpigal

+0

@Sorpigal: Le '$ s' est une erreur de copier-coller. Le slash supplémentaire que vous avez dans votre modèle "basename" n'est pas nécessaire. –

1

que je le ferais de cette façon

wvi() {(
    p=$(which "$1") 
    cd "${p%/*}" 
    ${EDITOR:-vi} "${p##/*/}" 
)} 

$ EDITOR au lieu de vi littérales jetés juste au cas où l'utilisateur peut préférer emacs (-:

+0

A moins que la fonction ne soit supposée changer le répertoire dans l'environnement shell appelant, le corps doit être entouré entre parenthèses pour que le changement de répertoire reste local. – Gilles

+0

Bon point. Fixé. – Sorpigal

Questions connexes