"cd" не работает в оболочке script

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

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

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

cd: 2: can't cd to /test

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

Ответы

Ответ 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