编译libjpeg-turbo时会在根目录下自动生成一个名为cjpeg的可执行脚本,其中有这样一个函数:
func_parse_lt_options ()
{
lt_script_arg0=$0
shift
for lt_opt
do
case "$lt_opt" in
--lt-debug) lt_option_debug=1 ;;
--lt-dump-script)
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
cat "$lt_dump_D/$lt_dump_F"
exit 0
;;
--lt-*)
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
exit 1
;;
esac
done
# Print the debug banner immediately:
if test -n "$lt_option_debug"; then
echo "cjpeg:cjpeg:${LINENO}: libtool wrapper (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1" 1>&2
fi
}
其中
/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'
/bin/sed -e 's/^X//' -e 's%^.*/%%'
这两条语句我有点不太理解……
实际执行了一下,从pipe传过来一个描述路径的字符串,这两条语句分别会提取父目录路径和文件名。不过还是看不懂两条语句最后的字符串。
这两次调用sed具体是如何执行的操作?
在别人帮助下理解了。
sed读到以s开头的字符串时会把s之后的下一个字符作为分隔符,并不是必须使用/为分隔符。
比如
sed -e 's/old/new/'
sed -e 's@old@new@'
sed -e 's%old%new%'
sed -e 's,old,new,'
都是正确的,执行了相同的功能