Используйте sed
для создания сценария sed
из mylist.tab и запуска его на data.tab:
sed \
-e '1i s/^[ \\t]*//' \
-e 's@\(.*\)@s/\\([ \\t]\\)\1\\b/\\11/@g' \
-e '$as/\\([ \\t]\\)[^ \\t]\\{2,\\}\\b/\\10/g' mylist.tab \
> /tmp/x.sed
sed -f /tmp/x.sed data.tab
Примечание Я предполагаю, что все строки в "mylist.tab" имеют не менее 2 символов.
$0
относится к вашему текущему скрипту, а dirname $0
получит имя каталога вашего текущего скрипта (полный путь без имени файла)
так что вы можете сделать это вот так:
$(dirname $0)/script.sh
Как показали другие ответы, ваше решение верное.
Как показали другие ответы, вы можете получить каталог сценария один раз и использовать его несколько раз. Это может быть чище и эффективнее.
Как показали другие ответы, вам может не понадобиться realpath
. Можете ли вы сказать, почему вы считаете, что вам это нужно?
Кажется, у вас есть лишние $(
и )
в вашем решении.
"$(dirname "$(realpath "$0")")/script.sh"
должно хватить…
…за исключением очень тонкого краеугольного случая, на который больше никто не указал. Давайте объединим другие ответы:
DIR="$(dirname "$(realpath "$0")")"
"$DIR"/script.sh
Если «текущий скрипт» находится в корневом каталоге (например, это /first_script
), и предполагая, что realpath
не имеет никакого эффекта, мы получим DIR="/"
, поэтому
"$DIR"/script.sh
Строка будет расширена как
"/"/script.sh
т. е.
//script.sh
Обычно это эквивалентно /script.sh
. Но Unix (POSIX )оставляет за собой право трактовать //
в начале имени пути специально. Бесконечно безопаснее сделать
DIR="$(dirname "$(realpath "$0")")"/
"$DIR"/script.sh
с дополнительным (явным)/
в конце определения DIR
. Если $0
равно /first_script
, DIR
будет установлено на //
. и "$DIR"/script.sh
будет расширен как ///script.sh
, который гарантированно эквивалентен /script.sh
. И если $0
является чем-то более распространенным, например /foo/bin/first_script
, то DIR
будет установлено на /foo/bin/
, и "$DIR"/script.sh
будет расширен как /foo/bin//script.sh
, который также гарантирует эквивалентность /foo/bin/script.sh
.