답변:
당신의 마법의 연합 은 세미콜론과 중괄호입니다.
{ cat wordlist.txt ; ls ~/folder/* ; } | wc -l
중괄호는 명령 만 그룹화하므로 파이프 부호 |가 결합 된 출력에 영향을줍니다.
()명령 그룹 주위에 괄호 를 사용 하여 서브 쉘에서 명령을 실행할 수도 있습니다 . 이것은 중괄호와 미묘한 차이가 있습니다. 예를 들어 다음을 시도하십시오.
cd $HOME/Desktop ; (cd $HOME ; pwd) ; pwd
cd $HOME/Desktop ; { cd $HOME ; pwd ; } ; pwd
현재 작업 디렉토리를 포함한 모든 환경 변수가 괄호 그룹을 종료 한 후 재설정되지만 중괄호 그룹을 종료 한 후에는 재설정되지 않습니다.
세미콜론의 경우, 대안은 &&및 ||부호를 포함하며 , 첫 번째가 성공하거나 그렇지 않은 경우에만 두 번째 명령을 조건부로 실행합니다. 예 :
cd $HOME/project && make
ls $HOME/project || echo "Directory not found."
{ list; }은 복합 명령 입니다. From bash(1): list는 현재 쉘 환경에서 간단하게 실행됩니다. 리스트는 개행 또는 세미콜론으로 끝나야합니다. [..] 반환 상태는 list의 종료 상태입니다.
man bash명령 줄에서 입력 하고 찾아보십시오.
wordlist.txt존재하지 않는 경우 cat표준 오류에는 오류가 표시되지만 표준 출력에는 표시 되지 않으므로 오류가 발생하지 않습니다 wc -l. ~/folder존재하지 않는 것도 마찬가지입니다 . 2> /dev/null각 명령과 세미콜론 사이에 표준 오류에 대한 노이즈를 방지하기 위해 추가 할 수 있지만, 추악한 것 이외의 오류 메시지는 라인 수를 계산하는 데 무해합니다.
wc파일 경로를 입력으로 받아들이 므로 프로세스 대체를 사용할 수도 있습니다.
wc -l <(cat wordlist.txt; ls ~/folder/*)
이것은 대략 다음과 같습니다.
echo wordlist.txt > temp
ls ~/folder/* >> temp
wc -l temp
ls ~/folder/*하위 디렉토리의 컨텐츠가있는 경우이를 리턴하는 마음 (글로브 확장으로 인해). 의 내용 만 나열하려면을 ~/folder사용하십시오 ls ~/folder.
wc -l단지 구성 된 예제였습니다. 실제로이 옵션이없는 더 복잡한 것으로 파이프하고 있습니다.
cat파일 인수 를 허용하므로 cat <(cat wordlist.txt; ls wordlist.txt) | wc -l및 을 사용할 수 있습니다 cat wordlist.txt <(ls wordlist.txt) | wc -l. 이것은 물론 추악하지만 명령 줄 도구를 사용하여 끝없는 가능성을 보여줍니다.
ls ~/folder/경우 너무 ~/folder입니다 심볼릭 링크가 ls목표의 내용이 아닌 링크 자체를 보여줍니다. 그건 그렇고, 모든 ls명령 뒤에 -1줄 당 하나의 파일이 인쇄되고 wc -l파일을 계산하는 올바른 방법이 있어야합니다.
-1출력은 터미널이 아니라 파이프이므로 암시됩니다.
나는 나 자신에게 같은 질문을하고 짧은 스크립트를 작성했다.
magicalUnionThing(나는 그것을 부른다 append) :
#!/bin/sh
cat /dev/stdin
$*
해당 스크립트를 실행 가능하게 만들기
chmod +x ./magicalUnionThing
이제 제대로 하는군
cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l
그것이하는 일 :
$*모든 인수를 문자열로 반환합니다. 해당 명령의 출력은 기본적으로 스크립트 표준 출력으로 이동합니다.따라서 magicalUnionThing의 표준 출력은 인수로 전달되는 명령의 표준 입력 + 표준 출력이됩니다.
물론 다른 답변에 따라 더 간단한 방법이 있습니다.
경우에 따라이 대안이 유용 할 수 있습니다.