이 명령을 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