シェルスクリプトを使用してErlインストールを自動化しようとしています。これは私のシェルスクリプトです -
unzip OTP-18.0-rc1.zip
cd otp-OTP-18.0-rc1
export ERL_TOP=`pwd`
./otp_build autoconf
./configure
echo $ERL_TOP
echo "################### MAKE ###################"
make -j8 && make install
echo "Creating soft links......"
ln -snf /home/user/erlang/otp-OTP-18.0-rc1/bin/erl /usr/bin/erl
ln -snf /home/user/erlang/otp-OTP-18.0-rc1/bin/erlc /usr/bin/erlc
# Install other packages
このスクリプトをリモートコンピュータでこのように実行しようとしています。
ssh root@host_ip 'bash -s' < my_script.sh
ただし、スクリプトはソフトリンクを生成せず、make コマンドの後で終了します。インストール中にエラーがないことを確認しました。また、スクリプトは、同じシステム上でローカルで実行された場合に完全に実行されます。
make
興味深いことに、次のように2つの別々の行にコマンドを入れるようにスクリプトを変更すると、
make -j8
make install
何も実行せずにスクリプトが終了します。make install
私がここで何を見逃しているのでしょうか?
答え1
問題はstdinを1つしか持てないということです。したがって、bashスクリプトがstdinから読み取るコマンドを実行すると、スクリプトの1行を占めます。
makeコマンドの標準入力をリセットしてみてください。たとえば、次のようになります。
( make -j8 && make install ) </dev/null
答え2
meuhの答えはうまくいきますが、ここに別のオプションがあります。
scp my_script.sh root@host_ip:/tmp/
ssh root@host_ip bash /tmp/my_script.sh