에코 >> 작동하지 않습니다

에코 >> 작동하지 않습니다

이것이 내가 단계별로 달성하려는 것입니다.

  1. 엘에스
  2. 그런 다음 출력을 반전시킵니다.
  3. 그런 다음 파일 끝에 새 줄을 추가하십시오.

그래서 다음과 같은 한 줄 스크립트를 만들었지만 오류가 발생합니다.

(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

관련 정보