簡體   English   中英

在腳本中運行時,su -c命令失敗

[英]su -c command fails when running in a script

我正在嘗試通過數字海洋Ubuntu服務器上的Shell腳本發出獨角獸命令。 該命令是:

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

該命令在命令行上發布時有效,但是如果我將其放入如下腳本中:

#!/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"

我收到此錯誤: -su: rbenv: command not found

如果刪除$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

得到不同結果的原因是,shell拆分了命令,實際上將其拆分為多個部分:

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'-' 'xxx' '-c' 'cd' '/home/xxx/apps/app_name' ,如果成功,則調用rbenv'rehash' ,等等...

在您的腳本中,所有這些都被解釋為一個參數:

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

說完所有這些后,應該清楚您的腳本正在執行應做的事情,但是rbenv不在su內的$PATH 您可以通過使用rbenv的絕對路徑來解決此rbenv

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

需要注意的幾件事:大寫變量名稱保留給環境變量使用 ,因此您應該考慮使用小寫名稱。 當您不將參數擴展用雙引號引起來時,它們將經歷單詞拆分遍歷

在您的情況下, su命令僅適用於cd命令。

Shell會將您的命令拆分為以下命令,並分別評估每個命令,並使用其返回碼(部分)評估&&表達式:

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
 `-- &&
     |-- su
     |   `-- shell
     |       `-- cd
     |-- rbenv
     |-- rbenv
     `-- unicorn

因此,將su應用於整個事物(根據需要),將其用引號引起來:

su - xxx -c 'cd /home... && rbenv ... && ...'

因此,當我們繪制固定命令的評估樹時,它將如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM