• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シェルスクリプト:while文のリダイレクトはサブシェルで実行されますか)

シェルスクリプト:while文のリダイレクトはサブシェルで実行されますか

notnotの回答

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4844/10253)
回答No.1

Solarisの環境は無いのでわかりませんが、 http://www.nurs.or.jp/~asada/FAQ/UNIX/section3.8.html Posix準拠のshだとカレントシェルでの実行のようです。

lunarosa
質問者

お礼

notnotさん ご回答ありがとうございます。上記 URL 参考になりました。 また、御礼が遅れて申し訳ありませんでした(ここ最近は Solaris10 に触れる機会があり、暫く Solaris にどっぷりつかっており当ページにアクセスしておりませんでした)。 因みに、Solaris の sh は純粋に BourneShell でした。当質問のケースでは、サブシェルで回っているようです。 Linux-Solaris 間で sh による汎用性のあるコードを書く場合、このような細かい部分に注意する必要がありそうですね。 まずは、ありがとうございました。

関連するQ&A

  • 【シェル】while文の変数定義について

    OS:Solaris10 sh:Bシェル お世話になります。 シェルの冒頭で定義した変数をwhile文の中で読み込ませたいです。 現状のシェルは下記の通りです。 ---- #!/bin/sh # *** 変数定義 *** AAA1=Spring BBB1=Summer AAA2=Autumn BBB2=Winter # *** メイン処理 *** i=1 while [ $i -le 2 ]; do AAA=AAA$i BBB=BBB$i echo ${AAA} echo ${BBB} i=`expr $i + 1` done ---- しかし、出力される結果は下記のようになってしまいます。 AAA1 BBB1 AAA2 BBB2 これを冒頭の「*** 変数定義 ***」で定義した値を読み込ませ、下記のような出力結果を得たいです。 Spring Summer Autumn Winter どうかご教授ください。

  • シェルスクリプトでwhileを用いてrshを繰り返し使う場合

    Bシェルスクリプトでリモートシェル(rsh)を使う場合の質問です。 現在、以下のような状態です。 有識者の方、アドバイスをお願いします。 ・Aでは、ループされずhostAの場合のみ処理がされます。 (while文が効いていない) ・Bでは、ループされて問題なくhostA,hostB,hostCが処理されます。 (while文が効いている) なぜなのでしょうか。。。(r系コマンドの特性?) ちなみり、リモート側のサーバには.rhostsが設定してあり 問題なくコマンドが通ることは確認済みです。 スクリプトA---------------------------------------------- #!/bin/sh while read line ; do rsh $line hostname done <<END hostA hostB hostC END スクリプトA---------------------------------------------- スクリプトB---------------------------------------------- #!/bin/sh while read line ; do echo " HOST=$line" done <<END hostA hostB hostC END スクリプトB----------------------------------------------

  • シェルでのループ

    プログラム完全初心者です。 whileを使って10~0までを表示するプログラムを作っているのですが 実行すると、何もコマンドがかえってきません。 文法が間違っているのでしょうか?? #!/bin/sh TOTAL=10 while [$TOTAL -lt 0] do TOTAL=`expr $TOTAL - 1` echo $TOTAL done

  • シェルスクリプト shiftとwhile

    下記の内容はスクリプトの一部を抜粋した内容です。 2箇所、理解が出来ない部分があるので、教えて頂けますでしょうか。 ------------------------------------------------ shift $(( $OPTIND -1)) if [ $# -eq 0 ]; then FileName="" elif [ $# -eq 1 ]; then if [ "\-" = "$1" ]; then FileName="" else FileName="$1" fi else echo "オプションが多い" exit fi if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done else while read line; do fcnctionA "$line" done < "$FileName" fi ------------------------------------------------ (1) if [ "\-" = "$1" ]; then 部分が理解できないのですが、教えて頂けますでしょうか。 (2)  if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done 基本はファイル名を指定して実行する事を前提としていると思います。 ファイル名を指定しないでスクリプトの実行をする場合は、1行ずつ標準入力で 入力すると思うのですが、このような使い方をする場合はあるのでしょうか。 下記よりも便利な点があるようでしたら、教えて頂けますでしょうか。 または、shiftと関係があるのでしょうか? if [ ! "" = "$FileName" ]; then while read line; do fcnctionA "$line" done < "$FileName" fi

  • 作成したbシェルを実行すると無限ループになってしまいます

    テストの為のデータをファイルに出力したいんですが無限ループになります。 #!/bin/sh i=1001 x=1 y=1 while [ $x -le 100 ]; do printf "$i,1019,001,3989,01" while [ $y -le 100 ]; do printf "01,00987,0,0,11,高橋," y='expr $y + 1' done i='expr $i + 1' x='expr $x + 1' y=1 done > test.csv カンマで区切った最初のデータを100個、 次のデータを100個ファイルに入れたいんですが、 実行すると無限ループになります。

  • シェルスクリプト

    while文のシェルスクリプトでエラーが出て困っています。 どうすればいいでしょうか? 回答の程宜しくお願い致します。 #!/bin/bash count=1 while[$count -le 5] do touch "y$count" ls -l "y$count" coun ='expr $count+1' done [root@Linux root]# . makefile bash: while[1 -le 5]: command not found bash: makefile: line 4: syntax error near unexpected token `do' bash: makefile: line 4: `do'

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • linuxシェルスクリプトにつきまして

    linuxシェルスクリプトにつきまして 下記のシェルスクリプトがあります。 このうちの、 $num `expr 500 + $num` $num $num の部分がわからず、解説いただきたく、お手数をお掛けしますが、何卒よろしくお願いいたします。 #!/bin/sh num=1 while [ $num -le 100 ]; do printf "user%03d,%d,500,User %03d,/home/user%03d,/bin/bash\n" \ $num `expr 500 + $num` $num $num num=`expr $num + 1` done

  • 【シェル】whileコマンドについて

    【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file