くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

【メモ】パイプでつないだ先のcdコマンドの挙動(bashとzsh)

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

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

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が出る

zshのばあい

  • 同じ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

zshに食わせたばあい

% zsh a.sh
a1=b
a=a
a=a
a=a
a2=a

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

結果:わからん