[英]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.