※これは個人的な疑問のメモです。解答はありません。

コマンドをパイプでつないでcdした時の挙動が、bashとzshで異なる

1
2
jot -b a 3 | while read L; do cd $L; done

bashのばあい

  • 特にカレントディレクトリは変更されません。

zshのばあい

  • a/a/aディレクトリへ移動します。

調査

①実行時のwhileの中のPIDを確認(サブシェルになっているかどうか)

1
2
echo $$ && jot -b a 3 | while read $L; do echo $$; done

bashのばあい

  • 同じPIDが出る

zshのばあい

  • 同じPIDが出る
→ どちらもサブシェルにはなってないっぽい?

②cdコマンドの場所を確認

1
2
which cd

bashのばあい

  • /usr/bin/cd

zshのばあい

  • cd: shell built-in command
ここで
1
2
3
4
5
6
% cat /usr/bin/cd
#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2.10.1.8.1 2012/03/03 06:15:13 kensmith Exp $
# This file is in the public domain.
builtin ${0##*/} ${1+"$@"}

ビルトインコマンドを呼び出しているだけ。→ /usr/bin/cdを呼んでいるのが怪しい?

③環境変数の引き継ぎを確認

こんなシェルを用意

1
2
3
4
5
a=b
echo a1=$a
jot -b a 3 | while read L; do echo a=$L; a=$L; done
echo a2=$a

bashに食わせたばあい

1
2
3
4
5
6
7
% bash a.sh
a1=b
a=a
a=a
a=a
a2=b

zshに食わせたばあい

1
2
3
4
5
6
7
% zsh a.sh
a1=b
a=a
a=a
a=a
a2=a

この結果だけを見ると、bashはサブシェルになってて、zshはサブシェルになってないような感じ。

結果:わからん