Bash程序  |  72行  |  1.97 KB

#!/bin/sh
#
# File functions utilized as part of abspath.sh, realpath.sh, etc.
#
#    Copyright (C) 2010, Cisco Systems Inc.
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Garrett Cooper, January 2010
#
# POSIX compliant bourne shell functions for performing make 3.81
# compliancy in 3.80 with a minimal set of external commands
# [awk(1) // readlink(1) only required].
#

# 0. Strip all heading and leading space.
# Paths:
# 1. Empty string - print out $PWD.
# 2. Not empty string...
#    i. Prefix all relative paths with $PWD.
#    ii. Replace /+ with /.
#    iii. Replace a/b/../c with a/c
#    iv. Replace /./ with /
#    v. Replace trailing /. with /
#    vi. Replace heading ./ with /
#    vii. Replace /. with "".

# testcases/kernel/controllers/libcontrollers/../../../..
_abspath() {
	echo "$@" | awk -v PWD=$(pwd) '{
	sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, ""); # 1.
	if ($0 == "") {
		print PWD
	} else {
		if (!($0 ~ /^\//)) { # i.
			$0 = PWD "/" $0
		}
		while (gsub(/\/\//, "/")) { }; # ii.
		while (sub(/\/[^\/]+\/\.\.\/?/, "/")) { }; # iii.
		while (sub(/\/\.\//, "/")) { }; # iv.
		sub(/(\/\.)?\/$/, "");
		sub(/^\.\//, "/");
		sub(/\/\.$/, "");
		if ($0 == "") {
			print "/"
		} else {
			if ($0 == ".") {
				print PWD
			} else {
				print
			}
		}
	}
}'
}

_realpath() {
	readlink -f "$@"
}