※これは個人的な疑問のメモです。解答はありません。
コマンドをパイプでつないでcdした時の挙動が、bashとzshで異なる
1
2
|
jot -b a 3 | while read L; do cd $L; done
|
bashのばあい
zshのばあい
調査
①実行時のwhileの中のPIDを確認(サブシェルになっているかどうか)
1
2
|
echo $$ && jot -b a 3 | while read $L; do echo $$; done
|
bashのばあい
zshのばあい
→ どちらもサブシェルにはなってないっぽい?
②cdコマンドの場所を確認
bashのばあい
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はサブシェルになってないような感じ。
結果:わからん