【メモ】パイプでつないだ先のcdコマンドの挙動(bashとzsh)
※これは個人的な疑問のメモです。解答はありません。
コマンドをパイプでつないでcdした時の挙動が、bashとzshで異なる
jot -b a 3 | while read L; do cd $L; done
bashのばあい
- 特にカレントディレクトリは変更されません。
zshのばあい
- a/a/aディレクトリへ移動します。
調査
①実行時のwhileの中のPIDを確認(サブシェルになっているかどうか)
echo $$ && jot -b a 3 | while read $L; do echo $$; done
bashのばあい
- 同じPIDが出る
②cdコマンドの場所を確認
which cd
bashのばあい
- /usr/bin/cd
zshのばあい
- cd: shell built-in command
ここで
% 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を呼んでいるのが怪しい?
③環境変数の引き継ぎを確認
こんなシェルを用意
a=b echo a1=$a jot -b a 3 | while read L; do echo a=$L; a=$L; done echo a2=$a
bashに食わせたばあい
% bash a.sh a1=b a=a a=a a=a a2=b