"CD" не работает в сценарии оболочки - PullRequest
27 голосов
/ 07 февраля 2011

Мне интересно, почему cd не работает в сценарии оболочки.Это выглядит следующим образом:

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

Когда я запускаю это, у меня не получается cd для проверки

cd: 2: can't cd to /test

Почему это так?

Ответы [ 11 ]

43 голосов
/ 11 июля 2012

У меня была такая же проблема.Выяснилось, что проблема заключалась в \ r \ n окончаниях строк.

Чтобы исправить это, выполните

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

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

4 голосов
/ 17 мая 2015

Не очень актуально для этого вопроса.У меня было то же сообщение об ошибке, однако я использовал

cd ~/foo/bar

После изменения на

cd $HOME/foo/bar

оно было исправлено.

3 голосов
/ 07 февраля 2011

поставить pwd в качестве первой строки.Затем посмотрите, есть ли в этом каталоге тестовый подкаталог.

Похоже, он запускается из корневого каталога

2 голосов
/ 19 сентября 2012

У меня была эта проблема, и я некоторое время был очень смущен.

Оказалось, что я установил переменную окружения $CDPATH, которая обычно позволяет обычным cd командам работать как обычно.Тем не менее, я выполнял свой сценарий в неинтерактивном режиме, как «sh» (не «bash»), где поведение немного отличается.Кажется, что команда вроде:

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

будет работать, как и ожидалось, в моей интерактивной оболочке входа в систему bash, даже если установлена ​​CDPATH.Тем не менее, когда я запускаю идентичную команду в скрипте (используя sh), она перестала работать с

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

Я изменил ее на относительный путь:

cd ./subdir

и онработает!Я считаю, что разница в том, как оболочка использует CDPATH.В одном случае он ищет как CDPATH , так и ваш текущий каталог, но в сценарии он только ищет CDPATH.Это похоже на поведение PATH.Если вы пропустите . (текущий каталог) из своего PATH, тогда вам нужно будет набрать ./localbinary вместо localbinary, чтобы выполнить этот файл.

Это мое обоснованное предположение.Когда я устанавливаю / сбрасываю CDPATH, он прерывает / отменяет команду cd subdir, и cd ./subdir работает во всех случаях для меня.

1 голос
/ 16 июня 2019

Ответ от Бенито Чаро находится на точке.Я просто хотел бы добавить еще один метод, который вы можете использовать для удаления \r\n окончаний строк.Откройте скрипт в текстовом редакторе Sublime и в меню

Перейти Вид → Окончания строк → Unix

Thisудалит символ '\ r' из вашего скрипта.Не забудьте сохранить файл.

1 голос
/ 19 августа 2012

Ну, я получил его с помощью ""

Так что в вашем случае это будет:

cd "test"

/ Marcus

0 голосов
/ 07 июня 2019

Я столкнулся с той же проблемой в Ubuntu.Моя командная оболочка:

$ export DIR=mydir

, затем запустите файл сценария, который содержит:

#!/bin/sh
cd ~/$DIR

, выдав вывод:

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

, попробовав много опций наВ конце концов, это можно решить только так:

#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
0 голосов
/ 24 июля 2017

Убедитесь, что вы находитесь в правильном каталоге

Запустите команду ниже, чтобы узнать, где вы находитесь

pwd

Сценарии оболочки запускаются внутри подоболочки, и каждая подоболочка имеет свою концепциюо том, что текущий каталог.cd завершается успешно, но как только выход из подоболочки завершается, вы возвращаетесь в интерактивную оболочку, и там ничего не меняется.

Попробуйте это

. myscript.sh
0 голосов
/ 07 февраля 2011

2 является ошибкой для "Нет такого файла или каталога".Вы уверены, что скрипт test существует в рабочем каталоге скрипта?

Возможно, вы захотите cd в известный «хороший» каталог, а затем перейдите в известные дочерние каталоги этого хорошего каталога.

0 голосов
/ 07 февраля 2011

Это зависит от того, откуда выполняется скрипт, если скрипт находится в вашем $ PATH, то он будет основан на текущем каталоге, из которого вы дали команду (рабочий каталог).

Еслиэто сценарий, выполняемый как задание cron, лучше использовать полный путь к каталогу.
Пример:
cd / home / user / test

Если указать полный путь, будет работатьскрипт находится в вашем $ PATH.

...