#
ドキュメント

Document

自分のための備忘録です。

シェル

目次

プロセス

linuxを参照

プロセスとシェル

  • コマンド実行からアプリケーション実行までプロセス単位で実行される
  • プロセスとサブシェルを混同しない

同一シェルで複数のプロセスが作成される例を以下に示す。
※サブシェルが作成されるわけではない。

# sample.sh
echo "process"
# グルーピング{}はカレントシェルで実行 グルーピング()はサブシェルで実行
{
  while : ;do
    echo "child processs"
  done
}

上記のスクリプトを実行すると 親プロセスと子プロセスの2つのプロセスが作成される。

$ ps auxf | grep bash
ec2-user 13165  0.0  0.4 124992  4188 pts/1    Ss   05:25   0:00          \_ -bash
ec2-user 13227 22.7  0.1 124992  1080 pts/1    S+   05:35   0:05              \_ -bash

サブシェル

プロセスとは関係なく、以下ではサブシェルが作成される。
サブシェルは以下の特徴を持つ

  • カレントシェルはサブシェルの実行が終わるまで待機する
  • サブシェルはカレントシェル(親シェル)の環境をすべて引き継ぐ
  • サブシェルの変更はメインシェルに影響しない

入門UNIXシェルプログラミング(p26)

シェルスクリプト実行とサブシェル

  • パイプ|:サブシェルで実行
  • $ sh script.sh:サブシェルで実行
  • $ ./script.sh:サブシェルで実行(実行権限付与済み $ chmod u+x script.sh
  • $ . ./script.sh:カレントシェルで実行

このようにしてコマンドラインからシェルスクリプトを起動すると、 カレントシェルは子プロセスとして もう一つシェルを走らせ、そこでシェルスクリプトを実行します。 この実際にスクリプトを実行するために走るシェルを サブシェル といいます。 子プロセスのサブシェルは親プロセス(カレントシェル)の環境を受け継ぐこと はできますが、その逆はできません。例えば、実行属性を与えたシェルスクリプト を使って環境変数を再設定しようとしても、再設定されるのはサブシェル側の環境変数 であってカレントシェルのものではありません。

https://flex.phys.tohoku.ac.jp/texi/sh/node21.html

シェルスクリプト内のサブシェル

  • ()によるグルーピングはサブシェルで実行
  • {}によるグルーピングはカレントディレクトリで実行

カレントシェルを作成する条件

  • . ./script.sh:別プロセスを作成せずにカレントシェルのプロセスでスクリプトが実行されるため、スクリプト実行後にカレントシェルでsample.shで定義された変数を使用できる。

コマンドとシェル組み込み関数

echoやprintfのように、同じ名前で実行ファイルで存在しているコマンド(ex:/bin/echo)と、シェルの組み込みとして存在しているコマンドがあったりする。 シェルスクリプト上ではパスを指定しないと組み込みのものが使われる。機能に差異があったりするので、実行ファイルのほうを使う場合は明示的にパスを指定するなどして区別する。

https://qiita.com/Ping/items/57fd75465dfada76e633

コマンド実行結果を変数に代入

`{{comand}}`か$({{command}})でコマンド実行結果を変数に代入。

# 引用元:https://qiita.com/Ping/items/57fd75465dfada76e633
TODAY=`date +'%Y/%m/%d'`
echo $TODAY
NOWTIME=$(date +'%H:%M:%S')
echo $NOWTIME

エラーをファイルへ出力

$ npm install 2> npm_warning.log

シェル変数と環境変数

  • シェル変数は定義したプロセスのみで有効。子プロセスには引き継がない
  • 環境変数は子プロセスでも有効 環境変数を定義するにはexportを使用する。

環境変数

printenvコマンド

環境変数を表示する。

$ printenv
// 環境変数一覧を表示
$ printenv SHELL
/bin/bash

envコマンド

$ env
// 環境変数一覧を表示(printenvとほぼ同等)

シェル変数

シェル変数はsetコマンドで一覧表示する。

$ set
// すべてのシェル変数を表示
$ Foo="Bar"
// シェル変数定義
$ set | grep Foo
// Foo=Bar
$ printenv | grep Foo
// 結果なし
$ export Foo
$ printenv | grep Foo  # 環境変数になる
// Bar

ref.
https://qiita.com/chihiro/items/bb687903ee284766e879