2016-06-12 3 views
1

디지털 바다 우분투 서버에서 쉘 스크립트를 통해 유니콘 명령을 실행하려고합니다. 명령은 다음과 같습니다스크립트에서 실행할 때 su -c 명령이 실패합니다.

su - xxx -c cd /home/xxx/apps/app_name && rbenv rehash && rbenv local 2.3.1 && /home/xxx/apps/app_name/bin/unicorn -c /home/xxx/apps/app_name/config/unicorn.rb -E production -D 

명령 행에서 발행하지만이 같은 스크립트에 넣어 경우이 명령이 작동 : 나는 경우 -su: rbenv: command not found

:

#!/bin/sh 

USER=xxx 

APP_ROOT=/home/xxx/apps/app_name 
RBENV_RUBY_VERSION=2.3.1 

SET_PATH="cd $APP_ROOT && rbenv rehash && rbenv local $RBENV_RUBY_VERSION" 
RAILS_ENV=production 
UNICORN="$APP_ROOT/bin/unicorn" 
UNICORN_OPTS="-c $APP_ROOT/config/unicorn.rb -E $RAILS_ENV -D" 
CMD="$SET_PATH && $UNICORN $UNICORN_OPTS" 

su - $USER -c "$CMD" 

나는이 오류 $CMD 주위의 따옴표를 제거하면이 오류가 발생합니다. su: invalid option -- 'E'

누구든지이 문제를 해결하는 방법을 알고 있습니까? 아래의 의견에 따라

,이 같은 rbenv하는 경로를 추가하여 스크립트를 수정 한 :

RBENV_ROOT="/home/$USER/.rbenv" 
SET_PATH="cd $APP_ROOT && $RBENV_ROOT/bin/rbenv rehash && $RBENV_ROOT/bin/rbenv local $RBENV_RUBY_VERSION" 

지금이 프로그램을 실행할 때 나는 다음과 같은 오류 얻을 : -su: cd /home/xxx/apps/app_name && /home/xxx/.rbenv/bin/rbenv rehash && /home/xxx/.rbenv/bin/rbenv local 2.3.1 && /home/xxx/apps/app_name/bin/unicorn /home/xxx/apps/app_name/config/unicorn.rb -E production -D: No such file or directory

답변

1

이유를 다른 결과를 얻으면 쉘 분할 명령은 실제로 곱셈 부로 분할됩니다.

su - xxx -c cd /home/xxx/apps/app_name 
&& rbenv rehash 
&& rbenv local 2.3.1 
&& /home/xxx/apps/app_name/bin/unicorn -c /home/xxx/apps/app_name/config/unicorn.rb -E production -D 

각 n 새 명령이 쉘에서 호출됩니다 (사용자 인 사용자가 아닌). 그 성공은 다음 'rehash'rbenv를 호출하는 경우

위의 수단은 '-' 'xxx' '-c' 'cd' '/home/xxx/apps/app_name'su 전화, 등등 ...

그리고 스크립트에서 이러한 모든

는 하나 개의 인수로 해석됩니다

# Terminal: 
su - user -c ls && echo 1 
# Script 
su - user -c 'ls && echo 1' 

이 모든 내용을 말하면 스크립트가해야 할 일을하고 있지만, rbenv은 이 아니며 su으로 설정되어 있어야합니다. 대문자 변수 이름은 environment variables에 예약되어 있습니다, 그래서 당신은 소문자 이름을 사용하는 것이 좋습니다 :

su - xxx -c 'cd /home/xxx/apps/app_name && /path/to/rbenv ...' 

몇 가지 참고 : 당신은 rbenv에 절대 경로를 사용하면이 문제를 해결할 수 있습니다. parameter expansions을 큰 따옴표로 묶지 않으면 word splittingglobbing이 발생합니다.

1

su 명령은 cd 명령에만 적용됩니다.우리가 평가 나무를 그릴 때, 그것은 모양을

su - xxx -c cd /home/xxx/apps/app_name 
rbenv rehash 
rbenv local 2.3.1 
/home/xxx/apps/app_name/bin/unicorn -c /home/xxx/apps/app_name/config/unicorn.rb -E production -D 

:

Shell은 다음 명령에 명령을 분할하고 개별적으로 각각 평가하고 자신의 리턴 코드를 사용합니다

는 (부분적으로)를 && 표현식을 평가 다음과 같이 : (당신이 원하는대로)

shell 
`-- && 
    |-- su 
    | `-- shell 
    |  `-- cd 
    |-- rbenv 
    |-- rbenv 
    `-- unicorn 

그래서 모든 일에 su를 적용하는 따옴표로 포장 :

우리는 고정 된 명령의 평가 나무를 그릴 때210

그래서, 그것은 다음과 같이 표시됩니다

shell 
`-- su 
    `-- shell 
     `-- && 
      |-- cd 
      |-- rbenv 
      |-- rbenv 
      `-- unicorn 
+0

요제프을 : 제안 주셔서 감사하지만, 난 여전히이 작업을 얻을 수 없습니다. '$ CMD'를'$ CMD = " '$ SET_PATH && $ UNICORN $ UNICORN_OPTS'"'로 바꾸면 su - ... : 해당 파일이나 디렉토리가 없습니다' – pdoak

+0

그게 또 다른 문제입니다. 이 스크립트에서, 당신은 이미 정확하게 인용 한 것이지만, 문제는'rbenv'를 실행하는 것입니다. $ PATH와'rbenv'가 어디 있는지 확인하십시오 :'whereis rbenv','echo "$ PATH"'- 스크립트에 넣고 수동으로 실행하면 차이가 나타납니다. –

+0

고마워.하지만 난 아직도이 일을 못해. 원래의 질문을 조정 된 스크립트로 업데이트했습니다. – pdoak