Ls 및 입력 리디렉션

Ls 및 입력 리디렉션

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섹션을 참조하세요명령 대체.

관련 정보