Я записал тестовый файл 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.
Обратные галочки вокруг каждой команды в вашем скрипте заставят оболочку взять вывод команды и выполнить это как команду.
Использование обратных кавычек вокруг команды эквивалентно помещению команды внутрь $( ... )
(это предпочтительный синтаксис для захвата вывода команды).
Сообщение об ошибке /home/user/final: Is a directory
исходит от ksh
при попытке выполнить результат pwd
в виде команды, а также , итого: команда не найдена
из-за попытки выполнить результат 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: Является ли каталогом
и не /home/user/final/their_file: Является ли каталогом
, заключается в том, что cd
выполняется в вложенной оболочке (что и происходит, когда вы помещаете его в обратные кавычки или внутри $( ... )
). Поскольку он выполняется во вспомогательной оболочке, фактическое изменение рабочего каталога не отражается в родительской оболочке (ваш скрипт).
По той же причине вы заметите, что когда ваш скрипт завершит выполнение, вы все еще будете в том же каталоге, в котором вы его запустили, а не в каталоге их_файл
.
Подробнее об этом читайте в разделах «почему функция cd в скрипте не работает» и «Скрипт для изменения текущего каталога (cd, pwd)» (и другие подобные вопросы).