• ベストアンサー

Bourne Shell と POSIX について

D-Matsuの回答

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

えー、原文でよいということですのでSingle UNIX Specificationを紹介しておきます。 これのShell & Utilities以下にシェルその他の規定があります。

参考URL:
http://www.opengroup.org/onlinepubs/009695399/
entree
質問者

お礼

回答ありがとうございます。 教えていただいた文書確認しました。 POSIX Shell が意外に高機能で驚きました。 具体的には、$( ) $(( )) alias、・・・ ただ、肝心の「local」については 互換性や別シェルにすることで 問題が回避できるなどの理由により、 は定義されなかったようですね。 現時点では関数部分を別シェルに切り出し、 グローバル変数を export するか、 local が使えないシェルで起動された場合は local が使えるシェルに exec で切り替える ことを考えています。

関連するQ&A

  • シェル変数(path)の挙動がわかりません

    シェル変数の挙動がわからなくて困っています。 以下のような3ファイルがあります。 % cat /tmp/test_config.sh #!/opt/local/bin/zsh path=($path /tmp) % cat /tmp/test.sh #!/opt/local/bin/zsh . /tmp/test_config.sh echo $PATH echo $path /tmp/test2.sh % cat /tmp/test2.sh #!/opt/local/bin/zsh echo $PATH echo $path which test.sh これを、所有者のユーザで実行するのとsu -c で実行するので挙動が変わります。 % /tmp/test.sh /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /tmp/test.sh % sudo su - hogehoge -c /tmp/test.sh /bin:/usr/bin:/usr/ucb:/usr/local/bin:/tmp /bin /usr/bin /usr/ucb /usr/local/bin /tmp /bin:/usr/bin:/usr/ucb:/usr/local/bin /bin /usr/bin /usr/ucb /usr/local/bin test.sh not found この挙動の違いは、何から産まれるんでしょう? .zshrc でそういう設定ができるんでしょうか? .zshenv は使ってません。 (なお、環境変数$PATHを使えば目的は果たせると言うのはわかっています)

  • 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

  • SHELLの変数代入について

    変数名に変数を使うとエラーになるのですが、 変数名に変数を入れることは可能なのでしょうか? #!/bin/sh #関数の初期化 for i in 0 1 2 3 4 5 6 7 8 do kannsuu${i}=0 done #終わり OS:solaris10 よろしくお願いします

  • Solarisでプロンプトの変更方法

    Solarisのコマンドプロンプトの変更方法について教えてください。 ユーザの.profileを以下のように修正しました。 ユーザ名やホスト名は出来たのですが、現在いるディレクトリの表示が 出来ません。下記の”$PWD”と言う部分で表示させたいと思っている のですが、色々試してもなかなかうまくいかず・・・。 OSはSolaris8、シェルはshで、シェルの種類は変えられません。。。 ========.profile==================== PS1="[`logname`@`hostname`:`$PWD`]# " PATH=$PATH:/usr/sbin:/usr/bin:/usr/local/bin:/sbin:/usr/ccs/bin:/usr/sfw/bin: export PATH PS1 MANPATH=$MANPATH:/usr/share/man:/opt/VRTS/man export MANPATH umask 022 ========env========================= [root@XXYYZZ:]# env HOME=/ HZ=100 LANG=ja LOGNAME=root MAIL=/var/mail/root MANPATH=:/usr/share/man:/opt/VRTS/man PATH=/usr/sbin:/usr/bin:/usr/sbin:/usr/bin:/usr/local/bin:/sbin:/usr/ccs/bin: PS1=[root@XXYYZZ:]# SHELL=ksh TERM=vt100 TZ=Japan _INIT_NET_STRATEGY=none _INIT_PREV_LEVEL=S _INIT_RUN_LEVEL=3 _INIT_RUN_NPREV=0 _INIT_UTS_ISA=sparc _INIT_UTS_MACHINE=sun4u _INIT_UTS_NODENAME=XXYYZZ _INIT_UTS_PLATFORM=SUNW,Sun-Fire-V240 _INIT_UTS_RELEASE=5.8 _INIT_UTS_SYSNAME=SunOS _INIT_UTS_VERSION=Generic_117000-03 アドバイス、よろしくお願いいたします。

  • bシェルでシェル変数に変数に代入されている値の個数

    bシェル(Bourneシェル)で、シェル変数に変数に代入されている 値の個数を知りたいのですが、できるのでしょうか。 ----- #!/bin/sh A="1 2 3 4 5" echo $A 変数Aには、半角スペース区切りで、「1 2 3 4 5」と5個の値が 代入されています。 この設定されている値の個数、5を求めたいのですが、 どうすればよいのでしょうか。 Solaris8 Bシェル です。

  • シェルで.bashrcが読めません。

    FreeBSD4.5で、 /home/me/の下に以下のシェルをファイル名1で作成し実行してもsuまでしか動きません。 パスもあっているのですが、原因は何が考えられますか? #!/bin/sh /usr/local/bin/sudo su www /usr/local/bin/bash source /home/me/.bashrc

  • シェルの中から他のシェルを呼び出す

    例えば、ひとつのシェルファイル( aaa.sh )の中に、 ------------------------- #!/usr/bin/csh set HOME=/home/test/tmp bbb.sh ------------------------- と記述した場合、bbb.shで変数$HOMEを使いたいと思いましたが、 使えないようです。(HOME: 未定義の変数と表示されます) どなたか、これ以外の方法で、このように シェルからほかのシェルを呼び出して、変数も引き継がれるような方法ご存知ないでしょうか? 多分こーやれば、こうなるかも!みたいなご回答でも結構ですので情報提供をお願いします。 どうぞ宜しくお願い致します。

  • ニフティでメールフォームを使用する方法

    ニフティの無料HPサービスでメールフォームを使いたいのですがsendmailが使えません。 以下の説明書きがありましたが、シェルスクリプトは知識がなく、ちょっと困っています。 シェルスクリプトでも可能なものなんでしょうか? ---------------------------------------------- perlについて perlのバージョンは5です。 (ただし、perl5での標準的なモジュールは使用できません) パスは、「/usr/local/bin/perl」となります。 スクリプトの1行目は「#!/usr/local/bin/perl」と記述してください。 シェルスクリプト(sh)について シェルスクリプト(sh)に関しては、以下のコマンドがご利用可能となっております。 awk, chmod, date, egrep, expr, grep, mkdir, rmdir, sh, cat, cp, echo, env, find, ls, mv, rm, sed なお、sendmailはご利用いただけません。 --------------------------------------------------

    • ベストアンサー
    • CGI
  • シェルスクリプトのコマンド グループ化における変数の有効範囲について教

    シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は  VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? 

  • expectでfor文のあるシェルファイルの記述について

    expect を使用しているAシェル内で、Bシェルを実行しています。(成功しています。) が、作成されたファイルのユーザを揃えたいため、 Aシェル内にBシェルの内容を記述したいと思っています。 Aシェルファイルでのfor文の記述と、 変数を受け取る方法がわからないため、エラーになってしまっています。 expect文内のfor文の記述と変数の受け取り方などおしえてください。 よろしくお願いいたします。 ------------------Aシェルファイル--------------------- #!/bin/sh set timeout -1 spawn su - ユーザ名 set prompt ".*ユーザ名.*" sleep 1 expect "Password:" send "パスワード\n" expect -re $prompt sleep 1 send "/パス/rename.sh\n" expect -re $prompt send "echo /var/www/html/パス/tokyo/*/*.jpg | xargs /usr/bin/mogrify -resize 500x -quality 100\n" expect -re $prompt send "exit\n" --------------------------------------- ------------------Bシェルファイル--------------------- #!/bin/sh declare -i i=1 for dirlist in `ls -l /var/www/html/パス/tokyo/ | awk '$1 ~ /d/ {print $9 }' ` do rm -rf /var/www/html/パス/$dirlist/small mkdir /var/www/html/パス/$dirlist/small done ---------------------------------------