web-dev-qa-db-fra.com

"cd" ne fonctionne pas dans le script Shell

Je me demande pourquoi cd ne fonctionne pas dans le script Shell. C'est comme suit,

#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)

Lorsque je lance ceci, je ne peux pas tester le CD

cd: 2: can't cd to /test

Pourquoi est-ce comme ça?

30
Abhishek

J'ai eu le même problème. Il s'est avéré que le problème était\r\n des fins de ligne.

Pour le réparer, faites

tr -d "\r" < oldname.sh > newname.sh

De http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2

45
Benito Ciaro

Pas vraiment pertinent pour cette question. J'ai eu le même message d'erreur, cependant, j'utilisais

cd ~/foo/bar

Après avoir changé cela en

cd $HOME/foo/bar

il a été corrigé.

4

mettez pwd comme première ligne. Vérifiez ensuite si ce répertoire possède un sous-répertoire de test.

Il ressemble à son exécution à partir du répertoire racine

3
Foo Bah

J'ai eu ce problème et j'ai été très confus pendant un certain temps.

Il s'avère que j'avais réglé mon $CDPATH variable d'environnement, qui permet normalement aux commandes cd normales de fonctionner comme d'habitude. Cependant, j'exécutais mon script en mode non interactif, comme "sh" (pas "bash"), où le comportement est un peu différent. Il semble qu'une commande comme:

cd subdir  # works via interactive bash; not in script run via sh.

fonctionnera comme prévu dans mon shell de connexion interactive, bash, même lorsque CDPATH est défini. Cependant, lorsque j'exécute la commande identique dans un script (en utilisant sh), elle échoue avec

myscript.sh: line 9: cd: subdir: No such file or directory

Je l'ai modifié pour être un chemin relatif:

cd ./subdir

et il fonctionne! Je pense que la différence réside dans la façon dont Shell utilise CDPATH. Dans un cas, il recherche à la fois CDPATHet votre répertoire actuel, mais dans le script, il niquement recherche CDPATH. Ceci est similaire au comportement de PATH. Si tu pars . (le répertoire courant) de votre PATH, alors vous devez taper ./localbinary au lieu de simplement localbinary pour exécuter ce fichier.

Ceci est ma supposition éclairée. Lorsque je mets/décompresse CDPATH, cela rompt/brise le cd subdir commande et cd ./subdir fonctionne dans tous les cas pour moi.

3
Tyler

La réponse de Benito Ciaro est sur le point. Je voudrais juste ajouter une autre méthode que vous pouvez utiliser pour supprimer \r\n fins de ligne. Ouvrez le script dans l'éditeur de texte Sublime et dans le menu

Aller à Affichage → Fin de ligne → Unix

Cela supprimera le caractère "\ r" de votre script. N'oubliez pas de sauvegarder votre fichier.

2
Abhinav Gupta

Eh bien, je l'ai fait fonctionner en utilisant ""

Donc dans votre cas ce serait:

cd "test"

/ Marcus

1
Oldek

Cela dépend d'où le script est exécuté, si le script est dans votre $ PATH, alors il sera basé sur le répertoire courant à partir duquel vous avez donné la commande (répertoire de travail).

S'il s'agit d'un script exécuté en tant que tâche cron, il est préférable d'utiliser un chemin de répertoire complet.
Exemple:
cd/home/utilisateur/test

Donner le chemin complet fonctionnera également si le script est dans votre $ PATH.

0
KazW

2 est l'errno pour "Aucun fichier ou répertoire de ce type". Êtes-vous sûr que le script test existe dans le répertoire de travail du script?

Vous voudrez peut-être cd dans un répertoire conn "bon" en premier puis dans les répertoires enfants conn de ce bon répertoire.

0
Matthew Iselin

J'ai fait face au même problème dans Ubuntu. Ma commande Shell est:

$ export DIR=mydir

puis exécutez un fichier script qui contient:

#!/bin/sh
cd ~/$DIR

donnant une sortie:

cd: 2: can't cd to ~/mydir

en essayant de nombreuses options, à la fin cela ne peut être résolu que comme ceci:

#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
0
Chetabahana

Ne devriez-vous pas utiliser

cd /test

au lieu? Je ne connais pas les scripts Shell, mais je peux voir que votre script particulier est sensible au répertoire actuel.

0
Kevin A. Naudé