쉘에서 "< ./somefile.txt"를 실행하면 무엇을 합니까?

쉘에서 "< ./somefile.txt"를 실행하면 무엇을 합니까?

그래서 방금 < ./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표준 입력을 읽을 수 없기 때문입니다 .

약간 더 흥미로운 변형은 다음과 같습니다.

>파일 이름

이는파일 이름그런 다음 아무것도 하지 마십시오. 이는 빈 파일을 만드는 편리한 방법입니다.

관련 정보