Je veux exécuter un script pour changer simplement le répertoire de travail actuel:
#!/bin/bash
cd web/www/project
Mais, après que je l'utilise, le pwd actuel reste inchangé! Comment puis je faire ça?
Je veux exécuter un script pour changer simplement le répertoire de travail actuel:
#!/bin/bash
cd web/www/project
Mais, après que je l'utilise, le pwd actuel reste inchangé! Comment puis je faire ça?
Réponses:
C'est un comportement attendu, et déjà discuté plusieurs fois.
Le script est exécuté dans un sous-shell et ne peut pas changer le répertoire de travail du shell parent. Ses effets sont perdus à la fin.
Pour changer de répertoire de façon permanente, vous devez source le script, comme dans
. ./script
source ./script
le même?
.
et source
sont égaux en bash. 2. nous n'avons pas besoin d'utiliser ./
avant nom_fichier s'il se trouve dans le même répertoire. C'est ok pour ne courir que ça:. script
Pour de petites tâches telles que celle-ci, au lieu de créer un script, créez un alias comme celui-ci,
$ alias cdproj='cd /dir/web/www/proj'
Vous devez l'ajouter à votre .bashrc
fichier si vous souhaitez le définir pour chaque shell interactif.
Maintenant, vous pouvez exécuter ceci en tant que $ cdproj
.
eval `./script`
ou eval $(./script)
d'exécuter ces commandes. Il s'agit d'une approche courante pour les commandes devant mettre à jour l'environnement du shell appelant.
eval
approche.
exec bash
à la finUn script bash opère sur son environnement actuel ou sur celui de ses enfants, mais jamais sur son environnement parent.
Cependant, cette question est souvent posée car on veut être laissé à l’invite de bash dans un certain répertoire après l’exécution d’un script bash depuis un autre répertoire.
Si tel est le cas, exécutez simplement une instance de l'enfant bash à la fin du script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Cela crée un nouveau sous-shell. Tapez exit
pour revenir au premier shell où le script a été initialement lancé.
exec
est généralement considéré comme le dernier recours d'un scélérat .. :)
exit
(ou en appuyant sur Ctrl + D), vous devrez le faire 11 à 21 fois. (2) L'utilisation d'un script exécutable présente un autre inconvénient: si vous définissez des options de shell (par exemple, dotglob
ou globstar
) dans votre session de shell interactive, vous les perdrez, car vous démarrez un nouveau shell.
Bien qu'il existe des réponses qui effectuent l'action exacte souhaitée, une méthode plus standard consiste à créer un lien symbolique:
ln -s ~/web/www/project proj #use full path to dir!
Ensuite, vous pouvez accéder cd
au répertoire en utilisant le nom proj
:
cd proj
Cette méthode est plus flexible car vous pouvez accéder aux fichiers en utilisant le nom abrégé sans cd
:
ls proj/ #note the endslash!
vim proj/file.x
Selon ce que vous allez faire, une autre solution peut être de créer une fonction au lieu d’un script.
Exemple:
Créez une fonction dans un fichier, disons /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Ensuite, incluez-le dans votre fichier bashrc
ou zshrc
:
# Somewhere in rc file
source /home/aidin/my-cd-script
Maintenant, vous pouvez l'utiliser comme une commande:
$ my-cd
Pourquoi ne pas utiliser "exec", il semble faire exactement ce que je souhaite.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(ou en appuyant sur Ctrl + D), vous devrez le faire 11 à 21 fois.
dotglob
ou globstar
), vous les perdrez, car vous démarrez un nouveau shell. … (Suite)
Vous pouvez le faire en utilisant une fonction ou en utilisant &&. Les exemples ci-dessous installent Zabbix et créent un fichier contenant une ligne.
Ex:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
ou:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
pour échapper à un script créé de cette manière, nonexit
, elles ressemblent à des fonctions de shell etexit
vont quitter le shell qui a généré le script.