web-dev-qa-db-fra.com

Alias ​​vers CD dans un répertoire et appel d'une commande

J'ai un .bash_profile et en ce que j'ai un ensemble d'alias. Ces alias n'exécutent actuellement qu'une seule commande et c'était assez facile. Je voudrais cependant faire deux choses avec un nouvel alias que j'essaie de créer.

  1. CD dans un répertoire
  2. Exécutez une commande à partir de ce répertoire
23
user232103

Pour exécuter une commande avec un répertoire de travail spécifique, on fait généralement

( cd directory && utility )

Les parenthèses autour du cd ... signifie que la ou les commandes qui s'y trouvent s'exécutent en sous-shell. La modification du répertoire de travail dans un sous-shell fait en sorte que le répertoire de travail actuel du shell appelant ne soit pas modifié, c'est-à-dire qu'après avoir appelé cette commande, vous serez toujours situé dans le même répertoire que celui où vous avez commencé.

Exemple:

( cd / && echo "$PWD" )  # will output "/"
echo "$PWD"              # will output whatever directory you were in at the start

Cela ne peut pas être transformé en un alias générique car un alias ne peut accepter aucun argument.

Pour un répertoire et un utilitaire spécifique, on pourrait faire

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

mais pour le cas général, vous devrez utiliser une fonction Shell:

cdrun () {
    ( cd "$1" && shift && command "$@" )
}

ou

cdrun () (
    cd "$1" && shift && command "$@"
)

Le remplacement des accolades par des parenthèses autour du corps de la fonction fait exécuter la fonction dans son propre sous-shell.

Ce serait utilisé comme

$ cdrun "$HOME/somedir" ./script.sh

qui exécuterait le script script.sh situé dans le répertoire $HOME/somedir, avec $HOME/somedir comme répertoire de travail, ou

$ cdrun / ls -l

qui vous fournirait une liste de répertoires au "format long" du répertoire racine.

La fonction Shell prend son premier argument et essaie de passer à ce répertoire. Si cela fonctionne, il décale le nom du répertoire des paramètres positionnels (la liste des arguments de la ligne de commande) et exécute la commande donnée par le reste des arguments. command est une commande intégrée dans le Shell qui exécute simplement ses arguments en tant que commande.


Tout cela est nécessaire si vous souhaitez exécuter une commande avec un répertoire de travail modifié. Si vous souhaitez simplement exécuter une commande située ailleurs, vous pouvez évidemment utiliser

alias thing='$HOME/somedir/script.sh'

mais cela fonctionnerait script.sh situé dans $HOME/somedir avec le répertoire actuel comme répertoire de travail.

Une autre façon d'exécuter un script situé ailleurs sans modifier le répertoire de travail consiste à ajouter l'emplacement du script à votre variable d'environnement PATH, par exemple.

PATH="$PATH:$HOME/somedir"

Maintenant script.sh dans $HOME/somedir pourra être exécuté de n'importe où en utilisant simplement

$ script.sh

Encore une fois, cela ne pas change le répertoire de travail de la commande.

27
Kusalananda
alias <name-of-the-alias>='cd <the-directory> && <command>'

Donc, si vous voulez changer de répertoire (cd) dans le dossier /var/log/ puis listez (ls) ses fichiers que vous pouvez ajouter dans votre .bash_profile déposer ce qui suit:

alias logs='cd /var/log/ && ls'
5
nikolas

J'utilise cette fonction pour exécuter une seule commande dans un répertoire différent:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

Une limitation de cette fonction est que les caractères génériques sont terminés par rapport au répertoire d'origine, et non par rapport au répertoire où la commande s'exécute. Il est possible de faire mieux en zsh .

Cette fonction agit comme le cd ordinaire si elle est appelée avec un seul argument, vous pouvez donc l'appeler cd. (Cette fonction ne prend en charge aucune option, mais les options de cd sont rarement utilisées.)

Séparez les commandes par un point-virgule, par exemple:

alias do_something='cd /tmp; ls'
0
John Elliot V