Ваше сообщение немного околачивается, и некоторые операторы, кажется, являются противоречащими, но если мое понимание корректно, у Вас есть a $0
из формы foo/scripts/bar.sh
, и Вы пытаетесь извлечь foo
часть. Вы, кроме того, гарантируете, что всегда будет по крайней мере два уровня каталогов в том пути (если Вы только будете иметь bar.sh
, Вы - тост). Затем можно просто лишить последние два компонента пути:
DIR=${0%/*/*}
Вы могли назвать свой сценарий через scripts/bar.sh
, Тем не менее, в этом случае простая замена шаблона не работала бы. Не говоря уже о вызове сценария через $PATH
. Можно сделать это условным выражением:
case $0 in
*/*/*) DIR=${0%/*/*};;
?*/*) DIR=.;;
/*) echo 1>&2 "Storing $0 in the root directory is not supported, aborting."
exit 125;;
*) # The script was called through the `PATH`
IFS=:; set -f; unset DIR
for d in $PATH; do
if [ -x "$d/$0" ]; then
# If you put relative directories in your PATH, you get what you deserve.
DIR=${d%/*};;
fi
done
if [ -z "$DIR" ]; then
echo 1>&2 "$0: Fatal error: I can't find myself."
exit 125
fi
unset IFS; set +f;;
esac
Поля сортировки AFAIK не имеют никакого интерактивного способа указать полевое число, необходимо дать его как аргумент C-u. Например, для 3-го поля: C-u 3 M-x sort-fields