2017-03-27 13 views
1
echo "who are you" | xargs [email protected] echo `echo @ | sed "s/who/where/"` 

예상 출력 치환되지 xargs를 가진 백틱 팽창 나오지 테스트 사례의 예.입력 문자열

+2

여기서 실제로 'xargs'를 사용하고있는 이유는 무엇입니까? 명확하고 직설적이며 정확한 방법은 간단히 'echo'입니다. sed "s/who/where /"' – tripleee

+4

... 그리고 굉장히 우회하지만 명목상으로 올바른 시도는'echo "당신이 누군지"| xargs -i @ sh -c 'echo @ | – tripleee

+1

나는 아무것도 성취하려고 시도하지 않고 스크립팅을 배우면서이 라이너가 무엇이 잘못되었는지 알고 싶었습니다. ** 안녕하세요 사람들은 물결표 앞에 백 슬래시를 무시합니다. ** –

답변

1

확장의 순서는 약간 수정되어야한다 :

명령 쉘에 의해 시작되기 전에 명령 대체 일이 당신의 예에서
echo "who are you" | echo "`sed "s/who/where/"`" | xargs [email protected] echo "@" 

:

echo "who are you" | xargs [email protected] echo `echo @ | sed "s/who/where/"` 

명령 치환이 수행합니다

echo @ | sed "s/who/where/" 

결과는 "@"으로 표시됩니다. st는 입력을 출력합니다. 다음 단계는 다음과 같습니다

who are you 
: 당신은 출력을 얻을 그래서 마침내

echo "who are you" 

:

echo "who are you" | xargs [email protected] echo @ 

xargs는 표준 입력 "당신이"이 명령을 구축하고 실행에 @ 대체

1

실제 사용 사례에는 실제로 xargs이 필요하다고 가정합니다.

$ echo "who are you" | xargs [email protected] sh -c 'echo "$1" | sed "s/who/where/"' - @ 
where are you 
  • 다음 샘플 명령의 간단한 재구성은 echo 'who are you' | sed 's/who/where/'

    이 예상되는 동작을 얻으려면, xargs 명시 적으로 쉘 명령이 포함 된 문자열을 쉘 바이너리 sh를 호출해야 될 것 twalberg이 가리키는대로, 시도에서 `...` 내부의 명령은 으로 평가되고xargs이 실행되기 전에 r 에 esults 리터럴@ (인해, 단순히 @ 출력 리터럴@echo하는 sed 명령 교체 것도 발견하지 않기 때문에, 전달하는) 그대로 xargs는 단순히 입력 으로 대체; twalberg는 다음과 같이 말합니다 : 효과적으로 실행 중임
    echo 'who are you' | xargs [email protected] echo @, 가상 no-op, 선행 공백과 후행 공백을 줄 이도록 저장하십시오.일반적으로

  • , xargs은 외부 유틸리티를 호출 할 수 있습니다, 당신은 쉘에게 기능을 필요로하는 명령이 필요한 경우 - 같은 파이프 라인으로가 - 당신은 명시 적으로 (쉘 명령을 포함하는 하나의 문자열와 쉘 바이너리를 호출해야합니다의) - 예 : ad-hoc 스크립트 - xargs에 의해 호출 될 때 해당 셸 인스턴스에 의해 평가됩니다.

  • sh -c 지정된 스크립트 (쉘 명령어를 포함하는 문자열) 평가와 /bin/sh를 호출하고, 그 스크립트에 위치 매개 변수xargs '인수를 전달하는 가장 안전합니다; 첫 번째 스크립트가 스크립트에서 $0에 바인드 한 후 더미 값 _을 사용하고 그 뒤에 @, xargs의 대체 문자열 (확장 된 값은 스크립트 내에서 $1에 바인딩 됨)을 사용한다는 점에 유의하십시오. sed에 원하는 출력을 수득 - xargs 통과 인자 -

  • 'echo "$1" | sed "s/who/where/"' 따라서이 파이프의 제 1 위치 파라미터를 애드혹 쉘 스크립트로서 작용한다.