Невозможно войти в папку на машине Linux. Пишет, что файл/папка не существует

Невозможно войти в папку на машине Linux. Пишет, что файл/папка не существует

Я написал тестовый ksh-файл, чтобы перейти в папку и сделать листинг. Написано следующее:

`cd "their_file/"`;

`pwd`;

`ls -l`;

Выдает мне следующий вывод:

./test.ksh: line 2: /home/user/final: Is a directory

./test.ksh: line 3: total: command not found

Это мой пароль:

/home/user/final

Как это исправить? Думаю, это выполнение оператора cd и выход из оператора. Я использую машину Fedora.

решение1

Обратные кавычки вокруг каждой команды в вашем скрипте заставят оболочку взять вывод команды и выполнить ее.чтокак команда.

Использование обратных кавычек вокруг команды эквивалентно помещению команды внутрь $( ... )(это предпочтительный синтаксис для захвата выходных данных команды).

Сообщение об ошибке /home/user/final: Is a directoryпоявляется при kshпопытке выполнить результат pwdкак команду, а также total: command not foundпри попытке выполнить результат ls -l.

Удалите обратные кавычки. Также удалите точки с запятой ( ;). Они нужны только в том случае, если вы хотите поместить две команды на одну строку:

cd dir; pwd

Ваш скрипт должен выглядеть примерно так:

#!/bin/sh

cd "their_file"
pwd
ls -l

Обратите внимание, что это все равно будет выполнено, pwdи ls -lесли cdпроизойдет сбой. Чтобы выйти из скрипта, если cdпроизойдет сбой:

#!/bin/sh

cd "their_file" || exit 1
pwd
ls -l

Здесь используется тот факт, что cdвозвращается ненулевое значениестатус выходаесли это не удается. ||(Логическийили) перед exit 1означает, что скрипт продолжит выполнять exitоператор, если cdвернет «false» (что в скриптах оболочки означает ненулевой статус выхода).


Причина, по которой вы получаете /home/user/final: Is a directoryинет /home/user/final/their_file: Is a directoryпотому что cdвыполняется всуб-оболочка(что и происходит, когда вы помещаете его в обратные кавычки или внутри $( ... )). Поскольку он выполняется в подоболочке, фактическое изменение рабочего каталога не отражается в родительской оболочке (вашем скрипте).

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

Более подробную информацию по этому вопросу см. в разделе "почему функция cd в скрипте не работает" и "Скрипт для смены текущего каталога (cd, pwd)" (и другие подобные вопросы).

Связанный контент