그래서 방금 < ./somefile.txt
셸에서 실행했는데 아무 일도 하지 않는 것 같았습니다(텍스트 파일에는 유효한 Linux 명령이 있었습니다). 그렇다면 텍스트 파일의 내용은 어디로 리디렉션됩니까? 나는 그것이 null이라고 추측하고 있지만 확실하지 않습니다.
운영 체제: 우분투 12.04
답변1
그래서 저는 그냥 리눅스 쉘에서 "< ./somefile.txt"를 실행했습니다.
bash
및 유사한 쉘 에서는 dash
아니요구현하다주문. 그건 그냥분배하다 somefile.txt
표준 입력으로. 명령을 제공하지 않으면 stdin이 사용되지 않으므로 아무 작업도 수행되지 않습니다.
stdin으로 작업을 수행하려면 다음을 시도해 보세요 cat
.
cat <./somefile.txt
표준 입력이 표준 출력에 반영 되므로 cat
터미널에 파일이 표시되는 것을 볼 수 있습니다.
반면에 스크립트를 실제로 실행하려면 다음과 같이 서브셸에서 실행할 수 있습니다.
bash ./somefile.txt
또는 (a) somefile.txt
에 실행 가능한 비트 세트( )가 있고 chmod +x somfile.txt
(b)가 완전히 sh
호환되거나 첫 번째 줄에 적절한 shebang(예 #!/bin/bash
: ) 이 있는 경우 다음을 수행합니다.
./somefile.txt
또는 현재 셸(즉그것을 얻으려면) 다음을 실행하십시오 :
. ./somefile.txt
또는:
source ./somefile.txt
일반적으로 현재 작업 디렉토리와 현재 쉘 환경의 다른 측면을 변경하려는 경우 스크립트를 얻습니다. 그러한 부작용이 없다면 이를 서브셸에서 실행하지 마세요.
고급 사용법
<./somefile.txt
@StéphaneChazelas는 이것이 파일을 읽을 수 있는지 테스트하는 데 ./somefile.txt
유용하다고 지적했습니다 . 예를 들어 ./somefile.txt
읽을 수 없는 경우 코드 1로 종료합니다.
<./somefile.txt || exit 2
이는 쉘이 ./somefile.txt
읽을 수 있는 stdin에만 할당할 수 있기 때문에 작동합니다. 그렇지 않은 경우 쉘은 오류 메시지를 표시하고 코드 1을 반환합니다. 이 코드는 "or ( ) 절을 트리거하며 ||
, 이 경우 스크립트가 코드 2로 종료됩니다. 동일한 테스트의 경우 다음과 같습니다.
[ -r "./somefile.txt" ] || exit 2
답변2
쉘에 따라 다릅니다. zsh의 경우 이는 "명령 없는 리디렉션" 섹션에 설명되어 있습니다. 기본적으로 가 READNULLCMD
명령으로 사용되며 기본값은 입니다 more
.
답변3
당신이 가지고 있는 것은 리디렉션이 포함된 빈 명령입니다. 사용중인 쉘을 지정하지 않았습니다. vinc17은 zsh에서 빈 명령을 처리하는 문제를 해결합니다. Bash에서는 빈 명령은 아무것도 하지 않습니다. 빈 스크립트와 같습니다. 다음 줄 사이를 읽어보면 이를 추론할 수 있습니다.배쉬 참조 매뉴얼:
간단한 명령을 실행할 때 쉘은 다음과 같은 확장, 할당 및 작업을 수행합니다.리디렉션, 왼쪽에서 오른쪽으로.
︙
명령 이름 결과가 없으면 리디렉션을 수행합니다., 그러나 현재 쉘 환경에는 영향을 미치지 않습니다. 리디렉션 오류로 인해 명령이 0이 아닌 상태로 종료됩니다.
(강조 추가) 즉,
<파일 이름
열려 있는파일 이름그런 다음 아무것도 하지 마십시오. 열기가 실패하면 쉘은 오류 메시지를 인쇄합니다. 어느 쪽이든 종료 상태( $?
)는 적절하게 설정됩니다(성공은 0, 실패는 1). 이는 다음과 같습니다.
잠 0 <파일 이름
sleep
표준 입력을 읽을 수 없기 때문입니다 .
약간 더 흥미로운 변형은 다음과 같습니다.
>파일 이름
이는파일 이름그런 다음 아무것도 하지 마십시오. 이는 빈 파일을 만드는 편리한 방법입니다.