Как выполнить сценарий, расположенный в том же каталоге, что и текущий сценарий?

Используйте 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 символов.

7
14.07.2016, 12:16
2 ответа

$0относится к вашему текущему скрипту, а dirname $0получит имя каталога вашего текущего скрипта (полный путь без имени файла)

так что вы можете сделать это вот так:

$(dirname $0)/script.sh
0
29.10.2020, 00:17

Как показали другие ответы, ваше решение верное.

  • Как показали другие ответы, вы можете получить каталог сценария один раз и использовать его несколько раз. Это может быть чище и эффективнее.

  • Как показали другие ответы, вам может не понадобиться 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.

2
30.10.2020, 06:39

Теги

Похожие вопросы