테스트용 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"가 반환되면 exit 1
스크립트가 명령문을 계속 실행함을 의미합니다(이것은 쉘 스크립트에서 0이 아닌 종료 상태를 의미합니다).exit
cd
당신이 얻는 이유 /home/user/final: Is a directory
와아니요 /home/user/final/their_file: Is a directory
cd
으로 실행 되기 때문이다.서브쉘(이것은 백틱이나 내부에 넣을 때 발생합니다 $( ... )
). 하위 쉘에서 실행되므로 작업 디렉토리에 대한 실제 변경 사항은 상위 쉘(스크립트)에 반영되지 않습니다.
같은 이유로 스크립트 실행이 완료되면 이전에 있던 디렉터리가 아니라 스크립트를 호출했을 때 있던 디렉터리에 여전히 남아 있다는 것을 알 수 있습니다 their_file
.
이 특정 사항에 대한 자세한 내용은 "스크립트의 cd 기능이 작동하지 않는 이유는 무엇입니까?" 그리고"현재 디렉터리를 변경하는 스크립트(cd, pwd)"(및 기타 유사한 문제).