Flutter(準備)+Mac+fish

使うまでにやったことメモ。


# Flutter
1. download
https://flutter.dev/docs/get-started/install/macos

2.
mfham@mac ~> mkdir work/flutter_dev
mfham@mac ~> cd work/flutter_dev/

3.
# バージョン上がってもすぐに対応できるかと思ってgitのほうにした
mfham@mac ~/w/flutter_dev> git clone https://github.com/flutter/flutter.git -b stable

4.
mfham@mac ~/.c/fish> echo $PATH
/Users/mfham/.phpbrew/php/php-7.4.5/bin /Users/mfham/.rbenv/shims /Users/mfham/.embulk/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin

mfham@mac ~/w/flutter_dev> set -U fish_user_paths ~/work/flutter_dev/flutter/bin $fish_user_paths

mfham@mac ~/w/flutter_dev> echo $PATH
/Users/mfham/work/flutter_dev/flutter/bin /Users/mfham/.embulk/bin /Users/mfham/.phpbrew/php/php-7.4.5/bin /Users/mfham/.rbenv/shims /usr/local/bin /usr/bin /bin /usr/sbin /sbin

5.
mfham@mac ~/w/flutter_dev> which flutter
/Users/mfham/work/flutter_dev/flutter/bin/flutter

# iOS
6.
Xcodeはインストール済み

7.
mfham@mac ~/w/flutter_dev> sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Password:
mfham@mac ~/w/flutter_dev> sudo xcodebuild -runFirstLaunch
Install Started
1%.........20.........40.........60.........80.........Install Succeeded

8.
mfham@mac ~/w/flutter_dev> sudo xcodebuild -license

By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel] agree

You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf

mfham@mac ~/w/flutter_dev>

9.
起動確認
mfham@mac ~/w/flutter_dev> open -a Simulator

10.
mfham@mac ~/w/flutter_dev> rbenv versions
  system
  2.3.1
  2.5.3
  2.6.5
* 2.7.0 (set by /Users/mfham/work/flutter_dev/.ruby-version)
  jruby-9.1.15.0
mfham@mac ~/w/flutter_dev> sudo gem install cocoapods
mfham@mac ~/w/flutter_dev> pod setup
Setup completed

# Android
11.
https://developer.android.com/studio
Version3.6.3

12.
起動
Install Type:Standard
Select UI Theme:Darcula
・HAXMインストールの許可のとき拡張機能がブロックされたので、「システム環境設定->セキュリティとプライバシー」で許可した

3.6以降は古いバージョンのAndroid SDK Toolsを手動で追加する必要があるとマニュアルに書かれてあるのでその通り対応する。
Preferences->Appearance&Behavior->System Settings->Android SDK
SDK Toolsタブをクリック、Hide Obsolete Packagesのチェックを外す。
するとチェックできる項目が増え、Android SDK Tools (Obsolete)にチェックを入れる(もともと入ってた)。
OKをクリック。
カラーがDarculaじゃなくなったぞ・・・?
=> Editor->Color SchemeでDarculaに変更。Defaultになってた。

13.
Set up the Android emulator
https://developer.android.com/studio/run/emulator-acceleration#vm-mac
->OK

# Set up an editor
14.
Visual Studio Codeを使う
https://flutter.dev/docs/get-started/editor?tab=vscode
手順通り。

15.
ここまででdoctor確認。
mfham@mac ~/w/flutter_dev> flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Mac OS X 10.14.6 18G4032, locale ja-JP)

[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    ✗ Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
[!] Android Studio (version 3.6)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.41.1)
[!] Connected device
    ! No devices available

! Doctor found issues in 3 categories.

16.
Android licenses not accepted
↓
mfham@mac ~/w/flutter_dev> flutter doctor --android-licenses
acceptする

Flutter plugin not installed;
Dart plugin not installed;
↓
https://flutter.dev/docs/get-started/editor?tab=androidstudio
Flutterプラグインをインストールする(Dartもついでにインストールされる)
その後のdoctorの結果
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Mac OS X 10.14.6 18G4032, locale ja-JP)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
[✓] Android Studio (version 3.6)
[✓] VS Code (version 1.41.1)
[✓] Connected device (1 available)

• No issues found!



17.
https://flutter.dev/docs/get-started/test-drive?tab=vscode
動いた

Create Android emulatorで次のエラーが出る

No suitable Android AVD system images are available. You may need to install these using sdkmanager, for example: sdkmanager "system-images;android-27;google_apis_playstore;x86"

16でAndroid StudioでFlutterプラグインをインストールしたあと、
Android Studio起動後にStart a new Flutter projectを選択してプロジェクトを作成する。
https://flutter.dev/docs/get-started/test-drive?tab=androidstudio
ナビゲーションバーのTools->AVD Manager->Create Virtual Device
Pixel 2 (適当)-> RecommendedにあるR (適当)のDownloadをクリック
(Flutterプラグインをインストールしていないと表示されなかったので混乱した)
↓
Visual Studio CodeでFlutterプロジェクトを開くと、右下からPixel2を選択できるようになった。
↓
このエラーが出た。
次のSOFにあるように、Android StudioからAVD Managerを開いて一度Stopさせて、その後Visual Studio Codeから再度Pixel2を選択するとうまくいった
https://stackoverflow.com/questions/55677874/failed-to-launch-emulator-error-emulator-didnt-connected-within-60-seconds

mac+phpbrew+Symfony+fish

前準備

# 入れておかないとphpbrew, Symfonyインストール時にエラーが起きたので
# 少なくともlibxml2 zlib bzip2 libiconvは必要だったはず
~> brew install libxml2 zlib bzip2 libiconv mhash mcrypt curl libedit gd

# git gzipも必要だと思う

fish

# fish 2.7.1だと~/.phpbrew/phpbrew.fishで次のエラーが起きたので、fishのバージョンを上げる
# Unsupported use of '&&'. In fish, please use 'COMMAND; and COMMAND'.
~> brew upgrade fish
~> fish --version
fish, version 3.1.0

GNU parallel causes "Unsupported use of '&&'. In fish, please use 'COMMAND; and COMMAND'." · Issue #5582 · fish-shell/fish-shell · GitHub

phpbrew

# https://github.com/phpbrew/phpbrew
~> curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
~> chmod +x phpbrew.phar
~> mv phpbrew.phar /usr/local/bin/phpbrew

~> phpbrew init

# たしかinitしたタイミングでconfig.fishに勝手にphpbrew.fishのsource記述が追加されたけど、
# 絶対パスだったので相対パスに直した
~> emacs ~/.config/fish/config.fish
source .phpbrew/phpbrew.fish

# 利用可能バージョン一覧
~> phpbrew known
# Symfony利用時にiconv拡張が必要だったのでdefaultに加えて追加する
# https://github.com/symfony/demo を利用するためにsqlite拡張も追加
~> phpbrew install 7.4.5 +default +iconv +sqlite

~> phpbrew use php-7.4.5
~> phpbrew list
* php-7.4.5
~> php -v
PHP 7.4.5 (cli) (built: Apr 18 2020 20:48:16) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
~> phpbrew system php-7.4.5 #これやらないと毎回phpbrew useで指定しないといけないかも?

その他

# valiants確認
~> phpbrew variants
# ロードされている拡張、利用可能な拡張確認
~> phpbrew extension

composer, Symfony

Installing & Setting up the Symfony Framework (Symfony Docs)

~> brew install composer

~> composer create-project symfony/skeleton symfony_study
~> cd symfony_study/
~> php bin/console --version
Symfony 5.0.7 (env: dev, debug: true)

~> curl -sS https://get.symfony.com/cli/installer | bash
~> mv /Users/mfham/.symfony/bin/symfony /usr/local/bin/symfony

# Webサーバー起動
~> symfony server:start

f:id:mfham:20200419154407p:plain
Webサーバー起動後画面

かっこいい

DNSを日常生活で例える

ストーリー

座席
社長 佐藤さん 7階711
A事業部長 市川さん 5階501
A事業部B開発グループ長 南さん 4階433
A事業部B開発グループ 星さん 4階455

根岸さん「mfhamさん、A事業部B開発グループ 星さんの座席、どこかわかりますか・・・?」
mfham「えーっと・・・探すね!」

@7階711
mfham「社長、A事業部B開発グループ 星さんの座席 を教えてください!」
佐藤さん「A事業部のことは A事業部長 市川さん に聞いてください。場所は5階501です。」
mfham「わかりました!」

@5階501
mfham「市川さん、A事業部B開発グループ 星さんの座席 を教えてください!」
市川さん「B開発グループのことは B開発グループ長 南さん に聞いてください。場所は4階433です。」
mfham「わかりました!」

@4階433
mfham「南さん、B開発グループ 星さんの座席 を教えてください!」
南さん「4階455です。」
mfham「ありがとうございます!」

mfham「星さんの座席は4階455だよー!」
根岸さん「ありがとうございます!」

~ 10分後 ~
根岸さん「あの・・・A事業部B開発グループ 星さんの座席ってどこでしたっけ・・・?」
mfham「4階455だよ!(私は記憶力がいいのである)」
根岸さん「ありがとうございます!」

解説

社長:ルートサーバー
根岸さん: スタブリゾルバー(Stub resolver)
mfham: フルリゾルバー(Full resolver)
市川さん、南さん: 権威サーバー(Authoritative server)
10分後の問い合わせにすぐ座席を返している状態: キャッシュ

合わせてチェックしたい

https://www.internic.net/domain/named.root
ヒントファイル。

RFC 7719 - DNS Terminology
DNS用語。

DNSがよくわかる教科書
読みやすい、理解しやすい、です。
読み終えて、2周目突入中です。

Basics_of_DNS_that_application_engineers_should_know - Speaker Deck
JPRSさんの本と一緒に。

DNSの仕組みの基本を理解しよう:DNSの仕組みと運用(1) - @IT
あとでしっかり目を通してみる。

DNS関連RFC一覧 - Qiita 読みたくなる願望・・・

AWS障害とdig

今のところこの半期で一番読んでためになった、楽しいという感情にもしてくれた本。

すらすら読めるし、用語の定義についても丁寧に説明してくれている。

digコマンドを使った名前解決の話、これまでいかに自分が雰囲気でdigを使っていたかというのを感じさせられた。

私と一緒に・・・ペアdigしませんか・・・?

DNSがよくわかる教科書

DNSがよくわかる教科書

AWS障害

AWS障害、大部分の復旧完了 原因は「サーバの過熱」 - ITmedia NEWS

サーバーでgit pullができなくなった。

そのときに上記の本で学んだことを使って原因が起きていそうなところを推測でき、その推測が当たっていたのが嬉しかった。

学んだことが活かせたときにセロトニンが分泌される気がする。

まとめ

幸せの名前解決をしてください(´;ェ;`)

validatorで勉強シリーズ

Vivaldiを使っておりまして、「W3Cのサービスによる検証」が手軽にできるのでこれを使っていろいろなサイトを見てみれば勉強になるんじゃないかと思ったのでやってみるシリーズ。

The W3C Markup Validation Service

題材

AbemaTV|国内最大の無料インターネットテレビ局

普段からよく見ています。
ドラ恋やオオカミくん、今ならかぐや姫についてワーキャー話したけど周りに見ている人がほぼいないので悲しいです。

結果

[Warning] Text run is not in Unicode Normalization Form C.

window.__REHYDRATE__ = ...に対してWarning。
誤認識している気がしているのでスルー。
ただ、Unicodeについて勉強するいい機会。次の2つおよび参考にされているリンクは見てみます。
ActiveSupport::Multibyte::Unicodeは仕事で使えるかもな・・・
「Text run is not in Unicode Normalization Form C.」というHTML Validation Serviceの警告について: 小粋空間 文字列の表記揺れをUnicode正規化で簡単に解決する方法 - Qiita

[Error] A meta element with an http-equiv attribute whose value is X-UA-Compatible must have a content attribute with the value IE=edge.

chrome=1がついているのがErrorの原因のよう。 あとで調べて記事更新する。
HTML 5.2: 4.2. Document metadata
html - Bad value X-UA-Compatible for attribute http-equiv on element meta - Stack Overflow

[Warning] The type attribute for the style element is not needed and should be omitted.

style要素のtype属性は必要なく省略されるべきとのこと。なるほど。
MDNにも現代では含める理由がないと書かれています。
HTML 5.2: 4.2. Document metadata

Active Supportメモ

Active Supportのn.monthn.yearの挙動が5.0系、5.1系以上で異なっていました。 バージョン上げるときにバグをうまないようメモしておきます。

https://github.com/rails/rails/blob/5-1-stable/activesupport/CHANGELOG.md

# 5.0.7.2
https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/duration.rb#L14-L15
SECONDS_PER_MONTH  = 2592000  # 30 days
SECONDS_PER_YEAR   = 31557600 # length of a julian year (365.2425 days)

> 1.month.to_i
=> 2592000

> 1.year.to_i
=> 31557600

> 12.months == 1.year
=> false

> 30.days == 1.month
=> true
# 5.1.7
https://github.com/rails/rails/blob/5-1-stable/activesupport/lib/active_support/duration.rb#L111-L112
SECONDS_PER_MONTH  = 2629746  # 1/12 of a gregorian year
SECONDS_PER_YEAR   = 31556952 # length of a gregorian year (365.2425 days)

> 1.month.to_i
=> 2629746

> 1.year.to_i
=> 31556952

> 12.months == 1.year
=> true

> 30.days == 1.month
=> false

CHANGELOG.mdに次のように書いてありますね。

The value of 365.2425 days in Gregorian year is more accurate as it accounts for every 400th non-leap year.

グレゴリオ暦 - Wikipedia

ユリウス暦 - Wikipedia

面白い〜

bash起動ファイルメモ

概要

manの結果を読んでみたけどぱっとみよくわからないので整理した。

基本的にDokcer(amazonlinux:2)、一部VirtualBox+CentOS7で検証した。

事前準備

次のDockerfileでDockerイメージを作成し、それを使う。

FROM amazonlinux:2

RUN \
  yum install -y procps sudo gcc man && \
  echo 'echo /etc/profile && echo $- && shopt login_shell'  >> /etc/profile && \
  echo 'echo .bash_profile && echo $- && shopt login_shell' >> ~/.bash_profile && \
  echo 'echo .bash_login && echo $- && shopt login_shell'   >> ~/.bash_login && \
  echo 'echo .profile && echo $- && shopt login_shell'      >> ~/.profile && \
  echo 'echo .bashrc && echo $- && shopt login_shell'       >> ~/.bashrc && \
  echo 'echo .bash_logout && echo $- && shopt login_shell'  >> ~/.bash_logout && \
  touch ~/.bash_env && echo 'echo .bash_env && echo $- && shopt login_shell' >> ~/.bash_env && \
  touch ~/.env && echo 'echo .env && echo $- && shopt login_shell' >> ~/.env && \
  useradd mfham -s /bin/bash && \
  echo 'echo mfham_.bash_profile && echo $- && shopt login_shell' >> /home/mfham/.bash_profile && \
  echo 'echo mfham_.bash_login && echo $- && shopt login_shell'   >> /home/mfham/.bash_login && \
  echo 'echo mfham_.profile && echo $- && shopt login_shell'      >> /home/mfham/.profile && \
  echo 'echo mfham_.bashrc && echo $- && shopt login_shell'       >> /home/mfham/.bashrc && \
  echo 'echo mfham_.bash_logout && echo $- && shopt login_shell'  >> /home/mfham/.bash_logout

ENV BASH_ENV=~/.bash_env
ENV ENV=~/.env

用語

ログインシェル(login shell)

  • 0番目の引き数の最初の文字が - であるシェル
  • --login オプション付きで起動されたシェル

対話的なシェル(interactive shell)

  • オプションでない引き数がなく、標準入力と標準エラー出力がいずれも端末に接続されていて(isatty(3)で調べられる)、-cオプションが指定されていない状態で起動されたシェル
  • -i オプション付きで起動されたシェル

非対話的なシェル

manの結果に定義が記載されていないので、対話的なシェルでないものと認識しておく。

bash

bashが対話的なログインシェルとして起動されるか、--loginオプション付きの非対話的シェルとして起動される

/etc/profileファイルが存在すれば、ここからコマンドを読み込んで実行する。
その後、~/.bash_profile, ~/.bash_login, ~/.profile の順番で探す。この中で最初に見つかり、かつ読み込みが可能であるファイルからコマンドを読み込んで実行する(最初に見つかったものだけ)。

また、--noprofileオプションを使ってシェルを起動すれば、/etc/profile~/.profile読み込みの動作を行わないようにできる。

非対話的なログインシェル(--loginオプションを使わない)

man bashの記述的に「非対話的なログインシェル(--loginオプションを使わない)」は/etc/profileを読み込まないと思っていたけど読み込んだ。
Difference between Login Shell and Non-Login Shell? - Unix & Linux Stack ExchangeのAnswer的に、システムによって読まれたり読まれなかったりするのかな?

ログインシェルが終了する

~/.bash_logout ファイルがあれば読み込んで実行する。

ログインシェルでない対話的シェルとして起動される

~/.bashrc ファイルがあれば、ここからコマンドを読み込み実行する。

--norcオプションを使ってシェルを起動すれば、~/.bashrc読み込みの動作を行わないようにできる。 --rcfile fileオプションを使うと、~/.bashrcの代わりにfileから読み込ませることができる。

(例えばシェルスクリプトを実行するために)非対話的に起動される

環境変数 BASH_ENV を調べ、この変数が定義されていればその値を展開し、得られた値をファイル名とみなして、そこからコマンドの読み込みと実行を行う。
つまり次のコマンドが実行されたのと同じように動作する。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
ただし、ファイル名を探すためにPATH環境変数の値が使われることはない。

--posixコマンドラインオプション等によりPOSIXモードで起動される

起動ファイルに関してPOSIX標準に従う。
このモードでは、対話的シェルはENV環境変数を展開し、展開して得られた名前のファイルからコマンドの読み込みと実行を行う。
ほかの起動ファイルは全く読み込まない。

リモートシェルデーモンrshdやセキュアシェルデーモンsshdによって実行された場合

~/.bashrcが存在し、かつ読み込み可能であれば、bashはコマンドをこのファイルから読み込んで実行する。 shとして呼び出された場合には、この動作は行わない。
--norcオプション、--rcfileオプションも使うことが可能。
(しかし一般的にはrshdはこれらのオプションを付けてシェルを起動しないし、指定もできないようになっている)

# VirtualBox+CentOS7での検証
mfham@localhost ~> sudo useradd mfham_test
[sudo] mfham のパスワード:

# backup
mfham@localhost ~> sudo cp /etc/profile /etc/profile_origin

# 事前準備1
mfham@localhost ~> sudo su -
[root@localhost ~]# echo 'echo /etc/profile' >> /etc/profile && echo 'echo $-' >> /etc/profile && echo 'shopt login_shell' >> /etc/profile

# 事前準備2
[root@localhost ~]# su mfham_test
[mfham_test@localhost ~]$ echo $SHELL
/bin/bash
[mfham_test@localhost root]$ cd
[mfham_test@localhost ~]$ echo 'echo bash_profile' >>~/.bash_profile && echo 'echo bash_login' >> ~/.bash_login && echo 'echo profile' >> ~/.profile && echo 'echo bashrc' >> ~/.bashrc && echo 'echo bash_logout' >> ~/.bash_logout

# ログイン
mfham@mac ~> ssh cent7_test
mfham_test@****'s password:
Last login: Sat Jan  5 05:48:17 2019
/etc/profile
himBH
login_shell     on
bashrc
bash_profile
[mfham_test@localhost ~]$ ps aux | grep mfham_test
root     10025  0.3  0.1 159300  6112 ?        Ss   05:57   0:00 sshd: mfham_test [priv]
mfham_t+ 10027  0.4  0.0 159300  2352 ?        S    05:57   0:00 sshd: mfham_test@pts/0
mfham_t+ 10077  0.0  0.0 112724   988 pts/0    R+   05:58   0:00 grep --color=auto mfham_test

# ログインシェルをshに変更
[mfham_test@localhost ~]$ chsh
mfham_test のシェルを変更します。
新しいシェル [/bin/bash]: /bin/sh
パスワード:
シェルを変更しました。
[mfham_test@localhost ~]$
# ログアウト後にログインしなおす
mfham@mac ~> ssh cent7_test
mfham_test@****'s password:
Last login: Sat Jan  5 05:52:10 2019 from ****
/etc/profile
himBH
login_shell     on
profile
-sh-4.2$

シェルが実ユーザ (グループ)IDと異なる実効ユーザ(グループ)IDで起動される

  • -pオプションが与えられていない場合
    • 起動ファイルは全く読み込まれず、シェル関数は環境から継承されず、SHELLOPTS,BASHOPTS,CDPATH,GLOBIGNOREが環境変数に含まれていても無視され、実効ユーザIDには実ユーザIDが設定される。
  • -pオプションが起動時に与えられた場合
    • 起動時の動作は同じだが、実効ユーザIDは再設定される。

参考:

# mfhamユーザでログイン、ログアウト
bash-4.2# su - mfham
/etc/profile
himBH
login_shell     on
mfham_.bashrc
himBH
login_shell     on
mfham_.bash_profile
himBH
login_shell     on
[mfham@6ac0fadafe8d ~]$
[mfham@6ac0fadafe8d ~]$ exit
logout
mfham_.bash_logout
himBH
login_shell     on
bash-4.2#

# bashのパーミッション変更
bash-4.2# ls -l /bin/ | grep bash
-rwxr-xr-x 1 root root  964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root      10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root    6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root       4 Nov 14 07:22 sh -> bash
bash-4.2# chmod u+s /bin/bash
bash-4.2# ls -l /bin/ | grep bash
-rwsr-xr-x 1 root root  964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root      10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root    6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root       4 Nov 14 07:22 sh -> bash
bash-4.2#

# 再度mfhamユーザでログイン
bash-4.2# su - mfham
Last login: Mon Jan 14 12:48:52 UTC 2019 on pts/0
-bash-4.2$
-bash-4.2$ pwd
/home/mfham
-bash-4.2$

# 実ユーザID、実効ユーザID確認用スクリプト作成
-bash-4.2$ vi test.c
-bash-4.2$ cat test.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    printf("uid = %d, euid = %d\n", getuid(), geteuid());
    getchar();
    return 0;
}

-bash-4.2$
-bash-4.2$ gcc test.c
-bash-4.2$ ls -l
total 16
-rwxr-xr-x 1 mfham mfham 8328 Jan 14 12:52 a.out
-rw-r--r-- 1 mfham mfham  166 Jan 14 12:51 test.c
-bash-4.2$

# 確認
-bash-4.2$ ./a.out
uid = 1000, euid = 1000
^C
-bash-4.2$

# -pオプションつけてのbash起動後に確認
-bash-4.2$ bash --login -p
bash-4.2# ./a.out
uid = 1000, euid = 0
^C
bash-4.2#

確認

# 対話的なログインシェル
bash-4.2# bash --login
/etc/profile
himBH
login_shell     on
.bash_profile
himBH
login_shell     on
bash-4.2#

# --loginオプション付きの非対話的シェル
bash-4.2# bash --login -c 'echo foo'
/etc/profile
hBc
login_shell     on
.bash_profile
hBc
login_shell     on
.bash_env
hBc
login_shell     on
foo
bash-4.2#

# 非対話的なログインシェル(--loginオプションを使わない)
bash-4.2# ln -s /bin/bash /bin/-bash
bash-4.2# -bash -c 'echo foo'
/etc/profile
hBc
login_shell     on
.bash_profile
hBc
login_shell     on
.bash_env
hBc
login_shell     on
foo
bash-4.2#

# --noprofileオプションを使って起動
bash-4.2# bash --login --noprofile
bash-4.2#

# logout
bash-4.2# bash --login
/etc/profile
himBH
login_shell     on
.bash_profile
himBH
login_shell     on
bash-4.2# exit
logout
.bash_logout
himBH
login_shell     on
bash-4.2#

# ログインシェルでない対話的シェルとして起動
bash-4.2# bash -i
.bashrc
himBH
login_shell     off
bash-4.2#

# ログインシェルでない対話的シェルとして起動(--norcオプション)
bash-4.2# bash --norc  -i
bash-4.2#

# ログインシェルでない対話的シェルとして起動(--rcfileオプション)
bash-4.2# touch tmp_file && echo 'echo tmp_file && echo $- && shopt login_shell' >> tmp_file
bash-4.2# bash --rcfile tmp_file -i
tmp_file
himBH
login_shell     off
bash-4.2#

# 非対話的に起動
bash-4.2# bash -c 'echo foo'
.bash_env
hBc
login_shell     off
foo
bash-4.2#

# 対話的なログインシェル(--posixオプション)
bash-4.2# bash --login --posix
.env
himBH
login_shell     on
bash-4.2#

shという名前でbashを起動

bashは古くからあるshの起動動作をできるだけ真似しようとし、またPOSIX標準にもできるだけ従おうとする。

参考:

# shはbashのalias
bash-4.2# ls -l /bin/ | grep sh
-rwxr-xr-x 1 root root 964728 Jul 27 18:42 bash
lrwxrwxrwx 1 root root     10 Nov 14 07:22 bashbug -> bashbug-64
-rwxr-xr-x 1 root root   6958 Jul 27 18:42 bashbug-64
lrwxrwxrwx 1 root root     19 Nov 14 07:22 setup-nsssysinit -> setup-nsssysinit.sh
-rwxr-xr-x 1 root root   1539 Oct  3 18:20 setup-nsssysinit.sh
lrwxrwxrwx 1 root root      4 Nov 14 07:22 sh -> bash
-rwxr-xr-x 1 root root  37368 Jul 31 20:17 sha1sum
-rwxr-xr-x 1 root root  37384 Jul 31 20:17 sha224sum
-rwxr-xr-x 1 root root  37384 Jul 31 20:17 sha256sum
-rwxr-xr-x 1 root root  37400 Jul 31 20:17 sha384sum
-rwxr-xr-x 1 root root  37400 Jul 31 20:17 sha512sum
-rwxr-xr-x 1 root root  54104 Jul 31 20:17 shred
-rwxr-xr-x 1 root root  50216 Jul 31 20:17 shuf

# 起動ファイルの読み込みを行った後にPOSIXモードに入る
bash-4.2# bash -c 'echo <(ls)'
/dev/fd/63
bash-4.2# sh -c 'echo <(ls)'
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `echo <(ls)'

対話的なログインシェルとして起動される、あるいは--loginオプション付きの非対話的シェルとして起動される

まず/etc/profile~/.profileの順でコマンドの読み込みと実行をしようとする。
また、--noprofileオプションを使ってシェルを起動すれば、/etc/profile~/.profile読み込みの動作を行わないようにできる。

対話的シェルとして起動される

環境変数ENVを調べ、この変数が定義されていればその値を展開し、展開で得た値をコマンドの読み込みと実行を行うためのファイル名として使う。
また、ほかの起動ファイルからコマンドの読み込みと起動を行うことはないので、--rcfileオプションは全く効果を持たない。

非対話的シェルとして起動される

ほかの起動ファイルを何も読み込まない。
(bashという名前で非対話的シェルとして起動した場合は、先述の通りBASH_ENVの参照)

確認

# 対話的なログインシェル
bash-4.2# sh --login
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# --loginオプション付きの非対話的シェル
bash-4.2# sh --login -c 'echo foo'
/etc/profile
hBc
login_shell     on
.profile
hBc
login_shell     on
foo
bash-4.2#

# 非対話的なログインシェル(--loginオプションを使わない)
bash-4.2# ln -s /bin/bash /bin/-sh
bash-4.2# -sh -c 'echo foo'
/etc/profile
hBc
login_shell     on
.profile
hBc
login_shell     on
foo
bash-4.2#

# --noprofileオプションを使って起動
bash-4.2# sh --login --noprofile
.env
himBH
login_shell     on
sh-4.2#

# ログインシェルでない対話的シェル
bash-4.2# sh -i
.env
himBH
login_shell     off
sh-4.2#

# 対話的なログインシェル
bash-4.2# sh --login
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# --rcfileオプションを使って起動
bash-4.2# touch tmp_file && echo 'echo tmp_file && echo $- && shopt login_shell' >> tmp_file
bash-4.2# sh --login --rcfile tmp_file
/etc/profile
himBH
login_shell     on
.profile
himBH
login_shell     on
.env
himBH
login_shell     on
sh-4.2#

# 非対話的シェルとして起動
bash-4.2# sh -c 'echo foo'
foo
bash-4.2#

まとめ

  • 知らぬも困らぬが役に立つ
  • /etc/profileの中身もあわせて理解しておきたい
  • こういう検証にDocker使うの便利
  • 私は最近fishシェルを使っている