
폴더에 CD를 넣고 목록을 작성하기 위해 테스트 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
내 비밀번호는 다음과 같습니다.
/홈/사용자/최종
이 문제를 어떻게 해결합니까? 나는 그것이 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
이는 0이 아닌 값을 반환 한다는 사실을 사용합니다.종료 상태실패하면. ( ||
논리적또는) 앞에는 "false"(셸 스크립트에서 0이 아닌 종료 상태를 의미함)를 반환하는 경우 exit 1
스크립트가 계속해서 명령문을 실행한다는 의미입니다 .exit
cd
당신이 얻는 이유 /home/user/final: Is a directory
와~ 아니다 /home/user/final/their_file: Is a directory
cd
는 다음과 같은 방식으로 실행되기 때문입니다.서브쉘(백틱이나 안에 넣으면 이런 일이 발생합니다 $( ... )
). 하위 셸에서 실행되므로 작업 디렉터리의 실제 변경 사항은 상위 셸(스크립트)에 반영되지 않습니다.
같은 이유로 스크립트 실행이 완료되면 디렉터리가 아닌 스크립트를 호출했을 때와 동일한 디렉터리에 계속 있게 됩니다 their_file
.
이 특정 사항에 대한 자세한 내용은 "스크립트의 CD 기능이 작동하지 않는 이유" 그리고 "현재 디렉토리를 변경하는 스크립트(cd, pwd)" (및 기타 유사한 질문).