이것이 내가 단계별로 달성하려는 것입니다.
- 엘에스
- 그런 다음 출력을 반전시킵니다.
- 그런 다음 파일 끝에 새 줄을 추가하십시오.
그래서 다음과 같은 한 줄 스크립트를 만들었지만 오류가 발생합니다.
(ls | tac | echo >>) > ./foobar
여러 명령으로 분할하여 이 작업을 수행할 수 있지만 하나의 명령으로 이를 수행하려고 합니다.
echo >> ./foobar
파일 끝에 새 줄이 삽입되어 혼란스러워요 .
그러면 내 코드의 이 줄이 작동하지 않는 이유는 무엇입니까? echo >>
파일 설명자 끝에 새 줄을 추가하지 않지만 오류가 발생하는 이유는 무엇입니까 ? 내가 여기서 뭘 잘못하고 있는 걸까?
답변1
>>
기호 바로 뒤의 파일 이름에 명령 출력을 추가하도록 쉘에 지시합니다 (따라서 최소한 닫는 대괄호 앞에 이름을 추가해야 합니다).
원하는 작업을 위해 다음을 수행할 수 있습니다.
ls | tac > ./foobar; echo >>./foobar
또는:
(ls | tac; echo ) >./foobar
둘 다 동일한 결과를 얻었습니다.
답변2
지정된 결과를 얻으려면 다음을 수행할 수 있습니다.
echo -e "`ls | tac`\n" > ./foobar
이런 방식으로 의 출력은 ls
파이프로 연결됩니다 tac
. 결과는 명령에 포함되며 echo
이스케이프 문자 해석을 위해 echo
새 줄이 추가됩니다 . 그런 다음 표준 출력을 파일로 리디렉션할 수 있습니다.
나는 stdout을 echo로 파이프할 수 있다고 믿지 않습니다.
답변3
명령이 구문 분석되는 방법은 다음과 같습니다.
(…)
복합명령입니다. 괄호 안의 내용은 서브쉘에서 실행됩니다.ls | tac | echo >>
ls
,tac
및 의 세 부분으로 구성된 파이프라인입니다echo >>
. 가장 왼쪽 섹션의 출력은 두 번째 섹션의 입력에 연결되고, 두 번째 섹션의 출력은 가장 오른쪽 섹션의 입력에 연결됩니다.ls
실행 파일을 실행하는 간단한 명령입니다.tac
실행 파일을 실행하는 간단한 명령입니다.echo >>
문법적으로 올바르지 않습니다. 연산자>>
뒤에는 파일 이름이 와야 하는데 누락되었습니다.
> ./foobar
복합 명령의 출력을 파일로 리디렉션합니다./foobar
.
입력을 다음으로 지시하는 것은 의미가 없습니다 echo
. 입력을 읽지 않습니다. echo
다른 명령의 출력에 추가하는 데 사용하려면 다음을 실행하십시오.echo
뒤쪽에병렬이 아닌 또 다른 명령입니다.
ls | tac; echo
의 출력은 echo
의 출력과 동일한 위치로 이동하므로 tac
리디렉션이 필요하지 않습니다.
( ls | tac; echo ) >./foobar
여기에는 서브쉘이 필요하지 않습니다. 간단한 그룹화가 가능합니다. (바라보다Bash의 간단한 논리 연산자Bash 대괄호 연산자 요약. )
{ ls | tac; echo; } >./foobar
>>
연산자를 사용 하여추가의이미 존재하는 파일에 추가하는 경우에만 필요합니다. 여기서는 그렇지 않습니다. 모든 명령은 동일한 위치로 이동하고 파일은 foobar
한 번만 열리며 전체 복합 명령이 실행되는 동안 열린 상태로 유지됩니다. >>
파일을 두 번 여는 경우 이 연산자가 필요합니다.
ls | tac >./foobar; echo >>./foobar