"cd" не работает в оболочке script
Мне интересно, почему cd
не работает в shell script. Это выглядит следующим образом:
#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)
Когда я запускаю это, я получаю не могу cd для проверки
cd: 2: can't cd to /test
Почему это так?
Ответы
Ответ 1
У меня была та же проблема. Оказалось, что проблема заключалась в окончаниях строк.
Чтобы исправить это, сделайте
tr -d "\r" < oldname.sh > newname.sh
От http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2
Ответ 2
Не актуально для этого вопроса. У меня было такое же сообщение об ошибке, однако я использовал
cd ~/foo/bar
После изменения этого параметра на
cd $HOME/foo/bar
он был исправлен.
Ответ 3
введите pwd
в качестве первой строки. Затем посмотрите, есть ли в этом каталоге тестовый подкаталог.
Похоже, что он работает из корневого каталога
Ответ 4
У меня была эта проблема, и я немного смутился.
Оказывается, я установил переменную среды $CDPATH
, которая обычно позволяет обычным командам cd
работать как обычно. Тем не менее, я запускал свой script в неинтерактивном режиме, как "sh" (не "bash" ), где поведение немного отличается. Кажется, что команда вроде:
cd subdir # works via interactive bash; not in script run via sh.
будет работать так, как ожидалось, в моей интерактивной оболочке входа, bash, даже если установлен CDPATH
. Однако, когда я запускаю идентичную команду в script (используя sh
), она не удалась с
myscript.sh: line 9: cd: subdir: No such file or directory
Я изменил его как относительный путь:
cd ./subdir
и он работает! Я считаю, что разница в том, как оболочка использует CDPATH
. В одном случае он ищет как CDPATH
, так и ваш текущий каталог, но в script он ищет только CDPATH
. Это похоже на поведение PATH
. Если вы оставите .
(текущий каталог) вне вашего PATH
, тогда вам нужно ввести ./localbinary
вместо localbinary
, чтобы выполнить этот файл.
Это мое обоснованное предположение. Когда я устанавливаю/отменяет CDPATH
, он прерывает/разрывает команду cd subdir
, а cd ./subdir
работает во всех случаях для меня.
Ответ 5
Ну, я получил его, используя ""
Итак, в вашем случае это будет:
cd "test"
/Marcus
Ответ 6
Нельзя использовать
cd /test
вместо этого? Я не знаю сценариев оболочки, но я вижу, что ваш конкретный script чувствителен к текущему каталогу.
Ответ 7
В зависимости от того, где выполняется script, если script находится в вашем $PATH, тогда он будет основан на текущем каталоге, из которого вы дали команду (рабочий каталог).
Если это script выполняется как задание cron, лучше всего использовать полный путь к каталогу.
Пример:
cd/home/user/test
Предоставление полного пути также будет работать, если script находится в вашем $PATH.
Ответ 8
2
- это errno для "Нет такого файла или каталога". Вы уверены, что script test
существует в рабочем каталоге script?
Сначала вы можете cd
в известном "хорошем" каталоге, а затем cd в известные дочерние каталоги этого хорошего каталога.
Ответ 9
Я столкнулся с той же проблемой в Ubuntu. Моя командная оболочка:
$ export DIR=mydir
затем выполните файл сценария, который содержит:
#!/bin/sh
cd ~/$DIR
дать вывод:
cd: 2: can't cd to ~/mydir
попробовав много вариантов, в конце концов, это может быть решено только так:
#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
Ответ 10
Ответ Бенито Чаро на месте. Я просто хотел бы добавить еще один метод, который вы можете использовать для удаления \r\n
окончаний строк. Откройте скрипт в текстовом редакторе Sublime и в меню
Перейти к представлению → Концы строк → Unix
Это удалит символ '\ r' из вашего скрипта. Не забудьте сохранить свой файл.
Ответ 11
Убедитесь, что вы находитесь в правильном каталоге
Выполните команду ниже, чтобы узнать, где вы
pwd
Сценарии оболочки запускаются внутри подоболочки, и каждая подоболочка имеет свою собственную концепцию того, что представляет собой текущий каталог. cd
преуспевает, но как только подоболочка выйдет, вы вернетесь в интерактивную оболочку и там ничего не изменилось.
Попробуйте это
. myscript.sh