
Я написал тестовый 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)" (и другие подобные вопросы).