`< file1 cmd1`을 `cmd1 file1`로 해석할 수 있나요?

`< file1 cmd1`을 `cmd1 file1`로 해석할 수 있나요?

이 명령을 C에서 다시 생성하라는 요청을 받았지만 cmd1이 무엇인지에 대한 추가 정보가 없습니다.

< file1 cmd1 | cmd2 > file2

내 문제는 명령의 첫 번째 문자인 <.

파이프 뒤의 명령을 무시하고 cmd1이 이라고 가정하겠습니다 cat.

그래서 이것을 C에서 더 쉬운 로 < file1 cat바꿀 수 있습니다 . cat file1하지만 이 접근 방식이 다른 명령에서도 작동합니까?

나는 다음 두 명령을 사용하여 이것을 테스트 했습니다 cat.sed

< Makefile cat
cat Makefile

그리고

< Makefile sed 'p'
sed 'p' Makefile

둘 다 동일한 결과를 인쇄합니다. 그러면 내가 < file1 cmd1그것을 다음과 같이 해석할 수 있다고 가정하는 것이 안전한가요 cmd1 file1?

답변1

아니 당신은 할 수 없습니다.

명령줄 인수로 나열된 파일이나 파일이 제공되지 않은 경우 stdin에서 처리할 데이터를 읽는 가장 일반적인 텍스트 처리 도구( sed, cut등 ) 와 같은 많은 프로그램이 있지만 이는 grep모든 프로그램의 경우입니다. 명령줄 인수는 stdin을 통해 제공되는 데이터와 다르며 이를 처리하는 것은 전적으로 프로그램에 달려 있습니다.

rm명백한 반례 는 표준 입력을 전혀 읽지 않는 이와 같은 프로그램입니다 . 그러나 동등한 것이 사실이라고 생각하더라도 파일 이름 인수를 전혀 허용하지 않는 필터 tr와 유사한 명령이 있습니다. wc다른 출력.


명령줄 구문은 tr대략 다음과 같습니다.

tr [options] string1 [string2]

파일 이름을 인수로 허용하지 않지만 항상 표준 입력을 읽습니다.

그러므로 턴

< file.txt tr abc xyz

입력하다

tr abc xyz file.txt

오류만 발생합니다.


의견에서 언급했듯이 wc이는 극단적이지는 않지만 다르게 동작하는 또 다른 일반적인 도구입니다. 파일 이름이 주어지면 출력에 포함됩니다( 와 달리 파일 이름이 하나만 있는 경우에도 grep).

$ wc hello.txt 
       1       1       4 hello.txt
$ wc < hello.txt
       1       1       4

또한 많은 프로그램에서는 stdin을 읽기 위한 명시적인 명령으로 파일 이름을 사용 -하지만 셸에서는 이를 지원하지 않습니다. 따라서 cat < -이라는 파일을 읽을 때 -의 표준 입력(아마도 터미널)에서 읽습니다 cat -.cat

관련 정보