2017-07-21 9 views
1

スクリプトの途中でユーザーを切り替えることができます。ここでdocを使用して別のユーザーとしてスクリプト内でコマンドを実行する

su - User << EOF 

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF 

私の目標は、ユーザーとして実際にログインしたかのように、EOFデリミタの間でコードを実行することです。

真ん中の行はホームブリューをインストールすることになっています。ユーザーとしてログインし、それ自身の中間行を実行すると、うまくインストールされます。しかし、上記の完全なスクリプトを実行すると、私に問題を与える:

-e:5: unknown regexp options - lcal 
-e:6: unknown regexp options - lcal 
-e:8: unknown regexp options - Cach 
-e:9: syntax error, unexpected tLABEL 
BREW_REPO = https://github.com/Homebrew/brew.freeze 
       ^
-e:9: unknown regexp options - gthb 
-e:10: syntax error, unexpected tLABEL 
CORE_TAP_REPO = https://github.com/Homebrew/homebrew-core.freeze 
        ^
-e:10: unknown regexp options - gthb 
-e:32: syntax error, unexpected end-of-input, expecting keyword_end 
-bash: line 34: end: command not found 
-bash: line 36: def: command not found 
-bash: line 37: escape: command not found 
-bash: line 38: end: command not found 
-bash: line 40: syntax error near unexpected token `(' 
-bash: line 40: ` def escape(n)' 

私が試した可能性だけではなく、自作のインストールが、時間のほとんどの問題を持っているの異なるコマンド。私がやろうとしているようにコマンドを「su」に渡すことと実際にそのユーザーとしてコマンドを実行することの違いは何ですか?

+0

この場合、「sudo -u」を使用できませんか? –

答えて

0

埋め込みコマンドはの前に実行され、の前にはsuに渡されます。これは、実際のあるsuに渡されたスクリプトは、より多くのこのようなものです:

/usr/bin/ruby -e "#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby 
# This script installs to /usr/local only. To install elsewhere you can just 
# untar https://github.com/Homebrew/brew/tarball/master anywhere you like or 
# change the value of HOMEBREW_PREFIX. 
HOMEBREW_PREFIX = "/usr/local".freeze 
HOMEBREW_REPOSITORY = "/usr/local/Homebrew".freeze 
HOMEBREW_CACHE = "#{ENV["HOME"]}/Library/Caches/Homebrew".freeze 
... 

のように。つまり、$(...)の出力がhere-documentに挿入されました。

ことを避けるために、あなたは$をエスケープする必要があります。また

su - User << EOF 

/usr/bin/ruby -e "\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF 

、あなたは二重引用符内の開始EOFを囲むことによって、任意の補間をせずに、文字通り全体ヒアドキュメントを治療するためのシェルを伝えることができます:

su - User << "EOF" 

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF 
関連する問題