2014-04-22 7 views
1

이 버그는 루비 스크립트에서 쉘 명령을 사용할 때 나타납니다. 명령은 bash 터미널에서 일어나는 것과 같이 실행되지 않습니다.Ruby에서 백틱 및 파이프 사용

처음 두 명령은 합리적이며 세 번째 명령은 적당합니다.

$ echo foo # => "foo\n" 
$ echo -n foo # => "foo" 
$ echo -n foo | cat # => "foo" 

내가 명령 루비에 echo에 호출에 전달하는 매개 변수를 엉망으로하고 방법이 있나요 : 배쉬에서

`echo foo` # => "foo\n" 
`echo -n foo` # => "foo" 
`echo -n foo | cat` # => "-n foo\n" 

, 우리는 다음과 같은 것? 익숙하지 않다면 echo 명령은 주어진 문자열을 반환합니다. -n 플래그가 없으면 줄 바꿈 문자가 추가되고 -n을 추가하면 줄 바꿈 문자가 추가되지 않습니다. cat은 주어진대로 반복합니다.

+0

'ruby -e 'a = \'echo -n foo | 고양이 \'; 인쇄 a'' 여기서 잘 작동! –

+0

@gniourf_gniourf 그것은/bin/sh에 어떤 쉘이 사용되는지에 따라 다릅니다. – chepner

답변

7

첫째, Ruby는 bash이 아닌 /bin/sh을 사용합니다. 시스템에서 /bin/sh/bin/bash에 대한 링크 일 수 있지만 bash은 더 나은 POSIX 준수를 위해 sh으로 호출 될 때 다르게 동작합니다. 그러나 귀하의 모범이 보여 주듯이 완벽하지는 않습니다. POSIX 사양에서는 echo이 "옵션을 지원하지 않아야합니다"라고 명시하지만 초기 인수 -n의 처리는 구현에 따라 다릅니다. /bin/bash에 대한 링크로 /bin/sh와 빠른 테스트에서

, bash -c "echo -n foo"bash -c "echo -n foo | cat" 생산 된 동일, 줄 바꿈없는 결과지만, sh -c "echo -n foo"sh -c "echo -n foo | cat"는보고 결과를 보여 주었다. (나는 sh로 호출 할 때 같은 ksh, dash, 또는 zsh로, 어떻게 행동하는지 다른 조개, 잘 모르겠지만, 기본적으로 그들은 모두 줄 바꿈 억제로 -n을 취급합니다.) 예측 결과를

대신 printf를 사용하는 서식 문자열에 \n이 포함되어 있지 않으면 절대로 改行을 인쇄하지 않습니다.

printf 'foo\n' 
printf 'foo' 
printf 'foo' | cat 

UPDATE :이 4.x의 시리즈 어떤 점에서 고정 bash 3.2에서 버그가 수 있도록 나타납니다. 4.1 이상에서는 sh -c "echo -n foo | catsh -c "echo -n foo"이 동일한 출력을 생성합니다.