• ベストアンサー

exec /bin/sh ファイル名

shスクリプトです。 startup=$HOME/.xsession if [ -f $startup ]; then if [ -x $startup ]; then exec $startup else exec /bin/sh $startup ※ fi fi ※のところなんですが、実行可能でない場合に、 /bin/shを付加するというのは、 どういった動作を意味するのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

execの引数は実行可能ファイルです。 実行可能ファイルでない(xビットが付与されていない)スクリプトファイルは(当たり前ですが)実行できませんので, シェル本体を実行して,シェルの引数としてシェルスクリプトを与えます。

msndance
質問者

お礼

なるほど、ファイルの中身をよみこませるような感じですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

exec というのは、確かに引数に指定されたものを実行するものですが ただ、/bin/sh ...と記述するのとは違う点は 現在実行中のもののプロセスIDや環境をすべて引き継ぐ点にあります。 例えば・・・おっしゃられたスクリプトが PID=123で実行されていた場合 /bin/sh $startup であれば /bin/shのPID=125とか新たに割り当てられる exec /bin/sh $start であれば /bin/shのPID=123と継承される(ps とかからは見れませんが) となります。

msndance
質問者

お礼

そんな細かい話があったんですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.2

実行可能ならばshellスクリプトは単独で動かす事が出来ますが、実行可能でない場合はshellスクリプトファイルをshに読ませて実行する、という事です。 結局、違いはないです。 xパーミッションが付いてる場合も付いていない場合も、とにかく$startupを実行する、という考慮ですね。

msndance
質問者

お礼

どちらにしろ、実行することになるということで、納得しました。微妙な違いですね。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • prコマンドについて

    prを使ってダブルカラムでプリントする入力フィルタのシェルスクリプトなんですが、 #!/bin/sh -f   ※1 if [ $1 = '-c' ] ; then shift fi if pr -2 -h "'date'($5@$7)" $2 $1  ※2 then exit 0 else exit 2 fi ※1の-fというオプションの意味と、 ※2の"'date'($5@$7)" $2 $1がよくわかりません。 $はパラメータの列番号かと思いますが、それがどのように利用されているのか、@の意味が何なのか、教えていただけないでしょうか。

  • シェルスクリプトで引数をファイル名に使うには?

    シェルスクリプトでutfとshift-jisの変換を行いたいと思ってます。 ファイル出力のところでファイル名を$1と引数にするとうまくいきません。(変換されてなかったり、空ファイルできたり) >! $1 ではなく $1.xx とかにするとうまくいきます。 どうしたら引数のファイル名に出力できるでしょうか? #!/bin/sh if [ $2 = 'us' ] then cp $1 $1.utf8 iconv -f UTF-8 -t SHIFT-JIS $1 >! $1 echo "$1 UTF-8 => SHIFT-JIS [ OK ]" elif [ $2 = 'su' ] then cp -f $1 $1.sjis iconv -f SHIFT-JIS -t UTF-8 $1 >! $1 echo "$1 SHIFT-JIS => UTF-8 [ OK ]" else echo "$1をコンバートできませんでした。" fi

  • grep -l '#!/bin/sh' * が動作しない

    FedoraCore4 bashで カレントディレクトリの複数の hoge.sh ファイルの中身に #!/bin/sh が書き込まれているファイルを調べる為に grep -l '#!/bin/sh' *.sh と実行すると期待通りに表示されました。 しかし、 grep -l '#!/bin/sh' * と実行したのですが次のプロンプトも表示されず止まってしまいました。 しかし、AIX5.2 bashでは grep -l '#!/bin/sh' * を実行すると正しく表示されました。 以下整理いたしました。 FedoraCore4 × grep -l '#!/bin/sh' * ○ grep -l '#!/bin/sh' *.sh AIX5.2 ○ grep -l '#!/bin/sh' * ○ grep -l '#!/bin/sh' *.sh 何故、動作の違いがあるのか教えて頂けないでしょうか。 よろしくお願い致します。

  • find -exec内のshに変数を渡す方法

    次のコマンドを実行しても、find -exec内の${from_dir}の内容が渡らず、/*.csvと解釈されます。 どのようにすればよろしいのでしょうか。 from_dir=/home/ksasaki find /home/s???????/ -maxdepth 0 -exec sh -c 'cp ${from_dir}/*.csv {}310/; ' \; 宜しくお願い致します。

  • 変数$importfileに第1引数($1)のファイルPATHを表示したい

    下記のスクリプトを書きましたが ./aa.sh: line 6: =/tmp: command not found と言われるのはなぜですか? 変数$importfileに第1引数($1)のファイルPATHを表示したいです。 1 #/bin/bash 2 3 echo $# 4 if [ $# -eq 1 ] 5 then 6 $importfile=$1 7 echo "$importfile" 8 else 9 echo "argv file notfound" 10 exit; 11 fi 12 実行結果 ./aa.sh /tmp 1 ./aa.sh: line 6: =/tmp: command not found

  • linuxでaliasをbashrcに記載してsh

    linuxでaliasをbashrc(bashrcでなくともログイン時に読み込まれるprofile)に記載してあるコマンドを設定したいのですが、これが上手くいきません。 やりたいことは、bashrcで設定したコマンド内容をshスクリプトで実行したいのですが、これはどうやれば出来るのでしょうか? 以下に.bashrcの内容とshスクリプトの内容を記載します。 .bashrcの内容 # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi alias log='tail -f /var/log/messages' test01.shの内容 #! /bin/bash log 実行すると ./test01.sh: line 2: log: command not found となってしまいます。 ちなみに、shの中ではなく、ログイン後にコマンド(log)だけプロンプトに打つとちゃんとtail -f /var/log/messagesの内容が出力されます。 shの作りが悪いのでしょうか? どなたかご教授いただけますとありがたいです。 osはlinux redhat5.4です。 どうぞよろしくお願いいたします。

  • Apache・tomcat同時再起動シェルスクリプト作成

    見よう見まねで初めて下記のシェルスクリプトを作成しました。 権限をrootに変更する文を追加したいのですが 良く解りません。ご教授よろしくお願い致します。 作成目的は、アプリプログラム反映時、一回のコマンド発行で起動を 行いたく作成しました。(面倒なので) #!/bin/bash # ############################################### # ## アプリサーバ二重化用手動再起動コマンド ### # ############################################### # ############## 環境設定 ####################### export PATH="/usr/local/apache2/bin" export CATALINA_HOME="/usr/local/tomcat" export JAVA_HOME="/usr/local/jdk1.5.0_10" export PATH="/usr/local/jdk1.5.0_10/bin" export TOMCAT_HOME="/usr/local/tomcat" # ############## 変数代入 ####################### # CMD1=`ps -ef | grep java | grep -v grep | wc -l` CMD2=`ps -ef | grep httpd | grep -v grep | wc -l` # ############## 停止コマンド発行 ############### # /usr/local/apache2/bin/apachectl stop if [ "$CMD2" -ge "1" ] ;then killall httpd /usr/local/tomcat/bin/shutdown.sh elif [ "$CMD2" = "0" ] ;then /usr/local/tomcat/bin/shutdown.sh fi # ############## 開始コマンド発行 ############### if [ "$CMD1" -ge "1" ] ;then killall java /usr/local/tomcat/bin/startup.sh elif [ "$CMD1" = "0" ] ;then /usr/local/tomcat/bin/startup.sh fi if [ "$CMD1" -ge "1" ] ;then /usr/local/apache2/bin/apachectl start elif [ "$CMD1" = "0" ] ;then /usr/local/tomcat/bin/startup.sh     /usr/local/apache2/bin/apachectl start fi

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.lo

    ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.log.1を削除し、存在しなければその旨をmessagesに記述するというシェルスクリプトを作成しました。 (OSはCentOS5.4で、cronで作成したシェルスクリプトを動作させております) <シェルスクリプトの内容> #!/bin/sh DATE=`date +%Y%m%d --date '1 day ago'` i=/var/log/aaa/bbb.log j=/var/log/aaa/ccc.log cat $i.1 | grep type=ccc > $j.$DATE sed '/type=ccc/d' $i.1 > $i.100 /bin/mv $i.100 $i.$DATE /bin/gzip $i.$DATE /bin/gzip $j.$DATE if [ test -e $i.$DATE.gz ]; then if [ test -e $j.$DATE.gz ]; then rm -f $i.1 else logger -p user.info "not find ccc.log" fi else logger -p user.info "not find bbb.log" fi これを実際に動作させますと、以下のエラーが表示されます。 ./test.sh: line 15: [: -e: binary operator expected どのように記述すれば正しく動作するのでしょうか。 お手数をおかけしますが、よろしくお願い致します。

  • if [ 条件式 ]とif[[ 条件式 ]]

    シェルスクリプトでのif [ 条件式 ] と if [[ 条件式 ]] の違いについて教えてください。 以下のシェルスクリプトを実行すると、 意図したとおり、111 と出力されます。 =========▼▼(ここから)▼▼========= #!/bin/sh AAA=yes if [[ "$AAA" = [yY]* ]] then echo 111 else echo 222 fi =========▲▲(ここまで)▲▲========= 上記、スクリプト3行目の if [[ "$AAA" = [yY]* ]] の部分を if [ "$AAA" = [yY]* ] というように、角カッコ 1重にすると、 エラーは発生しませんが、 222と表示されます。 if [ 条件式 ] と if [[ 条件式 ]] の違いについて教えていただけないでしょうか。

このQ&Aのポイント
  • Twitterで自分自身のエッチなコスプレ姿や下着姿の画像を投稿している女性について、オカズにすることは適切でしょうか?本人に言うべきでしょうか?この記事ではその問題について考えてみます。
  • オカズにすることは倫理的に問題があるのか、それとも個人の自由なのか。また、本人に言った場合の反応や関係への影響についても考えてみましょう。
  • なぜ女性が自分自身のエッチな姿の画像を投稿するのか、その心理や考えを知りたいと思いませんか?この記事ではそんな疑問にも答えています。
回答を見る