답변:
다른 사람들이 지적했듯이 cat 1.txt표준 명령을 무시 하므로 원래 명령이 실패합니다 . 첫 번째 인수 ( cat - 1.txt) 여야 함을 나타내 거나 블록 리디렉션 을 사용 하여 리디렉션 echo abc 하고 cat 1.txt 함께 지정하십시오 . 재치 :
{ echo abc; cat 1.txt; } > 2.txt
매뉴얼에서 발췌 한 내용 ( man bash) :
복합 명령
복합 명령은 다음 중 하나입니다. 대부분의 경우 명령 설명의 목록 은 하나 이상의 개행으로 나머지 명령과 분리 될 수 있으며 세미콜론 대신 개행이 이어질 수 있습니다.
(명부)리스트 는 서브 쉘 환경에서 실행됩니다 (아래 명령 실행 환경 참조). 쉘 환경에 영향을주는 변수 할당 및 내장 명령은 명령이 완료된 후에도 유효하지 않습니다. 반환 상태는 list의 종료 상태입니다.
{명부;}list 는 단순히 현재 쉘 환경에서 실행됩니다. 리스트 는 개행 또는 세미콜론으로 끝나야합니다. 이것을 그룹 명령이라고 합니다. 리턴 상태는 list 의 종료 상태입니다 . 메타 문자는 다른 것을 참고
(하고),{하고}있는 예약어 및 예약 된 단어가 인식 할 수 있도록 허용되는 경우 발생해야합니다. 단어 분리를 일으키지 않으므로 공백 또는 다른 쉘 메타 문자로 목록 에서 분리해야합니다 .
첫 번째 옵션 (서브 쉘 환경)에는 많은 부작용이 있으며, 대부분의 경우 시나리오와 무관합니다. 그러나 많은 명령 출력을 리디렉션하는 것이 필요한 경우 옵션 # 2 (그룹 명령)가 선호됩니다.
( echo "abc"; cat 1.txt ) > 2.txt
반향 출력을 cat로 파이프했지만 cat은 입력을 사용하지 않아 무시했습니다. 이제 명령이 차례로 실행되고 출력이 그룹화되고 (괄호) 2.txt로 지정됩니다.
POSIX 셸에서 다음 명령 cat file을 입력 으로 사용할 수 있습니다 echo.
echo $(cat file1.txt) "This Too"
Bash에서는 다음과 같이 프로세스 대체를 사용하고 echo를 다른 "파일"로 사용할 수 있습니다 cat.
cat file1.txt <(echo This Too)
그런 다음 출력을 파이프 또는 리디렉션합니다.
다른 모든 대답에서 알 수 있듯이 cat은 볼 파일이 있으면 stdin을 무시합니다. (나는 Daniel & mvw의 답변도 좋아합니다. +1)
<(command)구조는 떠들썩한 확장이다. POSIX는 아니기 때문에로 실행해야하는 스크립트에서는이를 신뢰할 수 없습니다 /bin/sh.
그냥 추측하지만 반복 가능한 프로세스가있는 것처럼 보입니다.이 프로세스는 별칭 또는 함수의 좋은 후보입니다. 별명은 일반적으로 단일 입력 스트림에서 인수와 같은 bash 명령 (예 : 약어)을 호출하기위한 단축키입니다.
alias hg="history | grep"
그러나이 경우 여러 개의 bash 명령뿐만 아니라 여러 개의 이산 입력 스트림을 결합하기 때문에 함수를 더 읽기 쉽게 할 수 있습니다. 두 개의 인수가 있는데, 첫 번째는 문자열이고 다른 하나는 파일 경로입니다. 결국, 결과를 stdout 출력 스트림에 기록하려고합니다.
CLI 프롬프트에서 다음을 입력하십시오.
# ecat()
{
echo ${1}
cat ${2}
}
귀하의 기능 이름은 ecat으로, 기억에 남습니다.
이제 다음과 같이 호출 할 수 있습니다
ecat "abc" 1.txt
추가하려면 다른 출력 대상을 stdout에 제공하십시오.
ecat "abc" 1.txt >> 2.txt
추가 리디렉션 연산자 '>>'는 지정된 파일의 끝에 출력을 추가합니다.
원하는 경우 ~ / .bashrc 파일에 추가하여 재사용하십시오.
declare -f ecat >> ~/.bashrc
또한 함수 정의 내에서 장식 등을 할 수 있음을 의미합니다.
~ / .bashrc에 파일을 추가하여 파일 덮어 쓰기를 방지하는 것도 좋습니다
set noclobber
"$1"하고 "$2". 이러한 맥락에서 중괄호는 아무 효과가 없습니다. 페이지는 ${name}당신이 그것을하지 무슨 생각을 의미하지 않는다 ... .
noclobber제안 은 당면한 질문에 어떻게 반응합니까? (전세계 행동을 수정하면 기본값을 염두에두고 작성된 스크립트 / 조언 / 연습을 어기는 경향이 있습니다).
다음 코드도 작동합니다.
echo abc >> 1.txt && cat 1.txt > 2.txt
의 출력 에코 ABC 방송 과 1.TXT에 추가됩니다 >> 그 후 &&가 있는 의지 명령의 다음 세트 실행하도록 말할 것이다 고양이 1.TXT을 다음 출력이와 2.txt를 . 기본적으로 첫 번째 명령의 출력을 1.txt에 추가 한 다음 1.txt의 출력을 2.txt로 보냅니다.
abc를 먼저 표시하려면 다음 코드를 사용할 수 있습니다.
echo abc >> 2.txt && cat 1.txt >> 2.txt
abc상기 하단 의 2.txt; 질문은 맨 위에 그것을 원합니다. (2) 수정1.txt 파일을; 이것은 받아 들일 수 없습니다.
echo전과 cat샘플 명령, 나는 그것이 결코 정확하게 있다고 가정 명시 적으로 , 그것은 이전 에코의 출력을 원한다고 말한다 입력 파일의 내용. 대부분의 사람들이 그것을 그렇게 해석 한 것 같습니다. (2) 1.txt는 입력 파일입니다. 질문은 수정에 대해 아무 말도하지 않습니다 1.txt. 입력 파일을 수정해서는 안된다는 사실은 말할 것도 없습니다.
cat그들이 어떤 파일 이름 인수가없는 경우에만 표준 입력을 읽습니다.