redirectioin 연산자를 사용하여 명령에 어떤 매개 변수가 제공되는지 확인하는 방법은 무엇입니까?


9

이것은 작동합니다 :

$ echo "HELLO에 알림 보내기"| 지금

이것은하지 않습니다 :

$ 지금 <echo "HELLO에게 알림 보내기"

'파일 또는 디렉토리를 찾을 수 없습니다'라고 표시되어 있습니다.

-f이 명령 에는 옵션이 있다는 것을 알고 있습니다. 이 명령을 사용하면 주어진 순간에 실행할 파일을 제공 할 수 있습니다.

그래서 이것은 나를 생각하게했습니다 ... 일반적으로 리디렉션 연산자가 값을 제공하는 매개 변수를 어떻게 알 수 있습니까?


5
귀하의 질문은 명확하지 않습니다. "어떤 매개 변수"는 무엇을 의미합니까? 문제는 (잘못) 생각하는 것이 아마 foo | barbar < foo동일합니다. 그들은 아닙니다.
terdon

답변:


16

여기서 두 가지 다른 것을 사용하고 있으며 세 번째를 사용해야합니다. 보자 :

  1. |: 이것은 파이프 연산자이며 한 프로세스의 출력을 다른 프로세스의 입력으로 전달하는 역할을합니다.

    foo | bar

    이것은 프로그램을 실행 foo하고 출력을 입력으로 프로그램 에 전달합니다 bar.

  2. >, <, >><<: 이들은입니다 리디렉션 연산자 가에서 /로 데이터를 전송하는 역할을, 파일 :

    • foo > bar: 프로그램을 실행 foo하고 그 출력을 저장 파일 bar , 덮어 쓰기 내용을 그것이 존재하지 않는 경우는, 작성합니다.

    • foo >> bar: 프로그램을 실행 foo하고 그 출력을 저장 파일 bar , 추가 내용과 그것이 존재하지 않는 경우는, 작성합니다.

    • foo < bar: 파일foo 에서 입력을 읽도록 지시 합니다 bar .

    • <<명령을 "추가"입력에 아무 문제가 없으므로,이 특별한 경우 <<에 사용 주로 (전용 AFAIK)입니다 여기 서류 :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF

      구문 << SomeStringHere > Out.file은 끝나는 문자열 ( EOF위의 예에서)이 나타날 때까지 작성된 모든 텍스트 를 대상 파일로 리디렉션 합니다. 이 문서를 사용하면 여러 줄 문자열을 쉽게 형식화하고 변수와 특수 문자를 포함시킬 수 있습니다.

  3. <<<연산자 여기서 문자열 하는 다음과 같은 문헌이지만 변수를 확장한다. 예를 들어,

    grep foo <<< "$bar"

    위의 명령은와 같습니다 echo "$bar" | grep foo.

  4. 실제로 찾고있는 것을 프로세스 대체 라고 하며 명령 출력을 다른 것으로 전달하는 또 다른 방법입니다. 로 구성됩니다 <(command).

    foo <(bar) 

    그래서, 당신을 위해 at예를 들어, 당신은 할 수

    at now < <(echo "notify-send HELLO")

    공정 대체 실제로 파일을 생성하기 때문에 위의 작품 (자세한 내용은 위의 링크를 읽기)과 함께 전달되는 해당 파일의 파일 기술자이다 <at now.


1 기본 동작은 덮어 쓰기이며 noclobber옵션을 bash 로 설정하여 수정할 수 있습니다 . 설정 echo foo > bar하면 bar존재 하면 실패 합니다. 이 경우 echo foo |> bar대신에 강제로 사용할 수 있습니다 . 여기에서 섹션 3.6.2를 참조 하십시오 .


1
좋은 대답입니다! 매우 철저하게 (특히 파일 리디렉터 사이의 차이점 포함)
steeldriver

@steeldriver aww, shucks, thanks :) 그리고 이것은 고귀한 보석 아래 였습니다 . 솔루션이 자동으로 피하는 다양한 함정 각각에 대해 +1을 줄 수 있었으면 좋겠습니다.
terdon

<<그리고 <<<(@steeldriver가 그의 답변에서 언급 한)에 대한 정보를 포함하도록 확장 할 수 있습니까 ? 또한,이 더 있습니다 - 같은 >>>>>><<<<<<<<<<?
Aditya

@Aditya가 완료되었습니다. 그리고 걱정하지 마십시오. <<<:)
terdon

12

이 경우, echo "notify-send HELLO"A는 공정 당신이 필요 - 그래서하지 않는 파일은 공정 대체를 파일 리디렉션보다는

at now < <(echo "notify-send HELLO")

명령을 완전히 피하기 위해 here 문자열 을 사용할 수도 있습니다echo

at now <<< "notify-send HELLO"

5
당신이 좋아하는 종류의 질문을 보았을 때 (내가하는 것과 같은 질문들) 나는 유닉스와 리눅스 에 더 많은 시간을 투자해야한다고 생각합니다 . 우리는 저기 멋진 쉘 트릭을 위해 살고 죽습니다.
terdon

@ terdon : 펄 골퍼들에게도 같은 것?
Sylvain Pineau

1
트윗 담아 가기 매우 그렇다 :). 정말로, 당신과 스틸 드라이버와 내가 즐기는 질문은 그보다 훨씬 일반적입니다. 장소는 명령 줄 괴짜의 가득 일부 누구가 터무니 지식.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.