ls
파일 내용을 명령 입력 으로 리디렉션하고 싶습니다 .
ls -l < /home/john/1.txt
콘텐츠는 다음과 같습니다 1.txt
.
/etc
나는 dir에 정의된 파일의 내용을 나열할 것으로 예상했지만 입력 ls
스트림 을 무시하는 것 같습니다. 여전히 파일 에 정의된 dir 대신 현재 dir의 내용을 나열합니다./home/jonh1.txt
/etc
/etc
/home/jonh1.txt
답변1
입력 스트림을 무시하는 것 같습니다
예. 프로그램ls
절대입력 스트림에서 아무것도 읽도록 작성되지 않았기 때문에 입력 스트림을 사용합니다. 이는 Unix 프로그램과 함께 자동으로 제공되는 것이 아니라 별도로 구현해야 합니다.
입력 스트림(stdin)을 명령줄 인수(argv)와 혼동하지 마십시오. 전자는 한 줄씩 읽을 수 있는 실제 스트림인 반면, 후자는 단순한 읽기 전용 단어 배열입니다. 귀하의 경우에는 둘 다 존재하며 다른 데이터를 포함합니다.
(왜 모든 프로그램에 대해 자동으로 실행되어서는 안 됩니까? 글쎄요.종류또는고양이또는grep예로서. 이러한 프로그램은 파일 이름을 인수로, 텍스트를 표준 입력 내용으로 다양한 종류의 값을 허용합니다. 따라서 명령을 에 파이프하면 | sort
입력이 정렬됩니다. 그러나 stdin과 명령줄이 동일하다면 | sort
파이프 입력이 파일 이름 목록이라고 생각하기 때문에 더 이상 아무것도 파이프할 수 없습니다. 또는 그 반대의 경우에는 이름만 정렬하기 때문에 파일 이름을 지정할 수 없습니다.)
대안을 보려면 다음을 참조하세요.StackOverflow에 대한 이 설명(댓글에서 이미 얻었습니다).
답변2
xargs를 사용해 보십시오:
xargs ls -l < /home/john/1.txt
답변3
사용자로부터 입력을 받는 명령줄 프로그램을 작성하면 무슨 일이 일어나고 있는지 매우 명확하게 알 수 있습니다. 프로그램에 read/readLine(언어에 따라 이름이 다를 수 있음) 명령문이 있어 프로그램이 사용자에게 입력을 요청하는 경우 |
또는를 사용하여 해당 입력을 파이프하거나 리디렉션할 수도 있습니다.<
입력을 받는 프로그램을 보면 more
또는 와 같은 것을 볼 수 있습니다 less
. 입력 없이 입력하면 $more<ENTER>
입력하라는 메시지가 표시됩니다. 데이터를 파이프로 연결하면 입력하라는 메시지가 표시되지 않습니다. 매개변수 없이 sed를 실행하면 $sed<ENTER>
오류가 발생하므로 $echo abc|sed<ENTER>
둘 중 하나를 수행할 수 없습니다. 하지만 그렇게 하면 $sed 's/a/b/'<ENTER>
입력하라는 메시지가 표시됩니다. 이것이 바로 echo abc|sed 's/a/b/'<ENTER>
작동하는 이유입니다.
Hello World처럼 간단하지만 프로그램이 단어를 묻는 메시지와 같은 입력을 받는 프로그램을 작성하고 사람이 'abc'를 입력하면 "Hello abc"라고 표시되는 경우에 이를 볼 수 있습니다. 해당 프로그램으로 파이프할 수 있습니다. 파이프 연결 및 입력 리디렉션이 작동하도록 하기 위해 추가 프로그래밍이 필요하지 않습니다. 프로그램이 사용자의 키보드 입력을 받아들이면 이에 대한 파이프 및 리디렉션이 작동하고 프로그램은 입력을 요청하지 않습니다.
답변4
편집하다
Kamil Maciorowski가 아래 의견에서 지적했듯이 다음은 올바른 방법이 아닙니다.
/home/john/1.txt
정확히 하나의 경로를 포함하는 것이 보장되는 경우반드시 큰따옴표를 사용해야 합니다. 파일에 둘 이상의 경로가 포함될 수 있고 의도적으로 단어 분할에 의존하는 경우 이는 임의의 경로를 제공하는 올바른 방법이 아닙니다.
원본 게시물(나쁜 예)
다음을 사용할 수 있습니다.
ls -l $(cat /home/john/1.txt)
> man bash
섹션을 참조하세요명령 대체.