스크립트 문제를 해결하고 있는데 각 줄을 수동으로 입력하여 한 줄씩 오류를 찾고 싶습니다.
내 스크립트에는 if 문이 있습니다.
if [ -d dir1 ]; then
rm -rf dir1
fi
그래서 명령줄을 입력해 보았습니다.
$ if [ -d dir1 ]; then rm -rf dir1 fi
>
Ctrl-D를 시도했지만 다음 메시지를 받았습니다: bash: 구문 오류: 예기치 않은 파일 끝
그렇다면 명령줄에 이 if 문을 어떻게 입력합니까?
답변1
짧은 대답: 그 뒤에는 세미콜론이 필요합니다 rm -rf dir1
.
실제 사례 보기: if
스크립트에 표시된 대로 정확하게 블록을 입력하세요.
$ if [ -d dir1 ]; then
> rm -rf dir1
> fi
실행 후 위쪽 화살표를 사용하여 마지막 명령을 다시 호출하면 if
전체 블록이 한 줄에 표시됩니다.
$ if [ -d dir1 ]; then rm -rf dir1; fi
쉘에는 if 블록 내의 명령 사이의 중단을 설명하는 방법이 필요합니다. 단순히 한 번에 실행되는 단일 명령으로 처리할 수 없으므로 세미콜론은 이를 구분하는 역할을 합니다.
답변2
John의 대답은 완전히 정확하지만 여전히 (매우 긴) 한 줄 명령을 입력하게 된다는 사실 외에도 여러 줄 명령을 입력하는 실용적인 방법이 있습니다.
$ if [ -d dir1 ]; then
> rm -rf dir1
> fi
그건... 그냥 들어가세요. 일단 입력되면 쉘은 명령이 아직 완료되지 않았음을 인식하고 "계속 프롬프트"를 제공합니다.
하지만 명령이라면예실제로 완료되었습니까? 아니면 의존하고 싶지 않습니까? 또한 가능성이 있습니다.
VLNEXT라고 하며 보통 으로 설정되어 있는데 ^V, 사용하고 싶다면진짜물론 stty -a
출력을 확인하고 cchars 그룹을 살펴보십시오 lnext
(BSD에서는 GNU stty가 상당히 정렬되지 않은 출력이지만 제게는 세 번째 줄에 있습니다).
추가적인 합병증으로는요리모드에서 Enter를 눌러 제출 ^M
(ASCII 0x0D)하지만 실제로는 ASCII 0x0A를 원하므로 ^J
VLNEXT를 눌러야 합니다.
그런 다음 이를 입력하면 if [ -d dir1 ]; then
^V^Jrm -rf dir1
^V^Jfi
Enter하나의 큰 명령으로 실행됩니다. GNU에서는 다음과 같이 보입니다.세게 때리다…
$ if [ -d dir1 ]; then
rm -rf dir1
fi
...그리고 View History를 누르면 ↑실제로 세미콜론이 포함된 한 줄짜리 테이블이 저장되는 것을 볼 수 있습니다.
다른 쉘은 다르게 렌더링될 수 있습니다. 예를 들어,므케시입력하면 이런 내용이 나옵니다...
$ if [ -d dir1 ]; then^Jrm -rf dir1^Jfi
...누르면 ↑역사적으로 저장되는 것을 볼 수 있습니다. ←몇 번 누르면 두 문자 (캐럿)와 가 ^J
아니라 실제로 제어 문자이기 때문에 단일 문자로 처리되는 것을 알 수 있습니다 .^
J
따라서 GNU bash는 더 나은 입력을 가지지만 내부적으로 변환하는 반면, mksh는 단일 행 입력(및 명령줄 편집)을 가지지만 입력한 그대로 정확하게 기록에 유지합니다.
존재하다다루기 힘든입력하면 여러 줄의 bash처럼 보입니다.
% if [ -d dir1 ]; then
rm -rf dir1
fi
...이것도 기록에 저장됩니다(mksh와 마찬가지로 zsh에는 여러 줄 입력 편집 기능이 있으므로 커서를 줄 위아래로 움직여 ^J
실제 줄 바꿈으로 확장할 수 있습니다. 이는 단점이 있습니다. 하지만 를 누르면 ^U
더 이상 전체 입력이 종료되지 않고 그 안에 있는 하위 라인만 종료됩니다.
야쉬1999년인 것처럼 행동하세요PDKSHmksh와 마찬가지로 한 줄을 취하지 ^J
만 각 줄을 개별적으로 기록에 저장하므로 ↑얻을 수 있는 것은 마지막 줄뿐입니다 fi
. 이는 매우 도움이 되지 않을 수 있습니다.
최신(Debian Stable/Bullseye)스프린트여기서의 동작은 mksh와 유사합니다.
현대 AT&T ksh93케시"u+m"은 훨씬 더 이상합니다. 입력하면 pdksh/mksh 계보의 사촌처럼 동작하지만, 누르면 ↑(만)첫 번째명령줄(pdksh와 같은 마지막 줄이 아님)도 별로 도움이 되지 않을 수 있습니다.
tcsh그건... 이상해요. 인라인 ^V^J으로 표시되기 때문에 ^M
(그렇지 않으면 mksh처럼 동작하고 물론 POSIX 호환 셸이 아니기 때문에 if
명령이 구문 오류와 함께 실패합니다), 두 경우 ^V^M모두 ^VEnterEnter를 누르는 것처럼 동작합니다.
> if [ -d dir1 ]; then^Mrm -rf dir1^Mfi
if: Expression Syntax.
rm: Command not found.
마지막으로, 원본시추…
% if [ -d dir1 ]; then^Jrm -rf dir1^Jfi
if: Expression Syntax.
...놀랄 것도 없지. 기록을 검색하는 대화형 방법이 없으며 history
저장된 줄을 표시하는 명령을 실행해도 출력(간단한 출력이라도 ls
)이 제공되지 않으므로 일부 설정을 활성화해야 한다고 생각합니다(사용한 적이 없습니다) C 쉘).
전체 공개: 저는 mksh 개발자입니다.
답변3
이는 쉘에 따라 다르지만 현재 편집 중인 줄을 편집할 수 있는 기본 편집기에 넣은 다음 저장하고 종료하는 방법이 있습니다. 이 작업이 완료되면 그에 따라 명령줄의 명령이 업데이트되며 Enter 키를 눌러 명령을 실행할 수 있습니다.
존재하다세게 때리다원하는 키 입력은 다음과 같습니다 CtrlxCtrle(2개의 키 코드, 다음 키 코드 다음에 입력)
EDITOR
환경 변수가 원하는 편집기로 설정되어 있는지 확인하세요 .