来自Kernighan& Sons的一个例子。 Pike, Unix编程环境,作者在与命令相同的行中进行变量赋值。这条线是这样的:
if PATH=$opath "$@" >$new
其中此行之前的变量值为:
PATH = / bin中:在/ usr / bin中
和opath = / a / really:/ long / list / of:/ pathnames
让我感到困惑的是,当我改变那条线时
if PATH=$opath echo $PATH
标准输出是:
/ bin中:在/ usr / bin中
我已经在sh和bash中证实了这一点。任何人都可以教我关于Kearnighan&派克在这儿干什么?自1982年以来,shell实现的这一方面是否发生了变化,还是其他事情正在发生?
编辑:这是本书的整个程序。
#!/bin/bash
# overwrite: copy standard input to output after EOF
# final version
opath=$PATH
PATH=/bin:/usr/bin
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/overwr1.$$; old=/tmp/overwr2.$$
trap 'rm -f $new $old; exit 1' 1 2 15
if PATH=$opath "$@" >$new
then
cp $file $old
trap '' 1 2 15
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
我理解程序正在做什么,以及如果“$ @”> $ new的退出状态为0,if条件将如何评估为true。我不明白为什么PATH没有赋值在“if”行中的$ opath。
答案 0 :(得分:5)
shell在
上执行的扩展PATH=$opath echo $PATH
是(按此顺序):
$PATH
展开为其当前值$opath
展开为其值echo
等于PATH
扩展的环境中执行$opath
命令。因此命令会看到PATH
的修改值,但该赋值不会影响shell执行的扩展。
此外,即使后续命令也不会看到$opath
的新值,它仅限于当前命令。
当命令部分为空时(即只有一个赋值),该逻辑会改变;
PATH=$opath
echo $PATH
将首先更改当前执行环境中$PATH
的值,然后打印新值。