Как исправить синтаксис sed tee awk? - PullRequest
0 голосов
/ 04 июля 2019

Я новичок в Manjaro Linux с zsh и использую Ranger в качестве файлового менеджера. Кажется, что скрипт работал до обновления, но не уверен, что он вообще связан.

Скрипт (shortcuts.sh) считывает файл (.key_directories), который содержит список путей к определенным папкам. Каждая строка содержит несколько букв и путь к каталогу, то есть 2 столбца:

Примеры:

md /run/media/
mov /run/media/movies
docs /run/media/docs

затем добавляет немного текста, который зависит от того, в каком файле окажется список. Либо текстовый файл (.shortcuts), который будет использоваться в качестве списка псевдонимов для bashrc и zshrc, либо текстовый файл (ярлыки. conf), который будет использоваться файловым менеджером ranger в качестве списка путей к разным папкам.

Сценарий работал отлично, пока не сделал. Я не уверен, где проблема.

Вот полный скрипт shortcuts.sh:

#!/bin/bash

    # Shell rc file (i.e. bash vs. zsh, etc.)
    shellrc="$HOME/.zshrc"
    bshellrc="$HOME/.bashrc"

    # Config locations
    folders="$HOME/.config/ranger/.key_directories"
    configs="$HOME/.config/ranger/.key_files"

    # Output locations
    shell_shortcuts="$HOME/.shortcuts"
    ranger_shortcuts="$HOME/.config/ranger/shortcuts.conf"

    # Remove
    rm -f "$ranger_shortcuts" 2>/dev/null
    echo "alias \\" > "$shell_shortcuts"

    # Ensure text of argument 1 exists in the file argument 2
    ensure() { (grep "$1" "$2")>/dev/null 2>&1 || echo "$1" >> "$2" ;}

    ensure "source $shell_shortcuts" "$shellrc"
    ensure "source $shell_shortcuts" "$bshellrc"
    ensure "source $HOME/.config/ranger/shortcuts.conf" "$HOME/.config/ranger/rc.conf"

    # Format the `folders` file in the correct syntax and sent it to all three configs.
    sed "s/#.*$//;/^$/d" "$folders" | tee >(awk '{print $1"=\"cd "$2" && ls -a\" \\"}' >> "$shell_shortcuts") \
        | awk '{print "map g"$1" cd "$2"\nmap t"$1" tab_new "$2"\nmap m"$1" shell mv -v %s "$2"\nmap Y"$1" shell cp -rv %s "$2}' >> "$ranger_shortcuts"

    # Format the `configs` file in the correct syntax and sent it to both configs.
    sed "s/#.*$//;/^$/d"  "$configs" | tee >(awk '{print $1"=\"$EDITOR "$2"\" \\"}' >> "$shell_shortcuts") \
        | awk '{print "map "$1" shell $EDITOR "$2}' >> "$ranger_shortcuts"

Вот содержимое .key_directories:

# add here the path to your directories

md /run/media/
mov /run/media/movies
docs /run/media/docs

Я получаю ошибку:

shortcuts.sh: line 28: syntax error unexpected token `('
shortcuts.sh: line 28: sed "s/#.*$//;/^$/d" "$folders" | tee >(awk '{print $1"=\"cd "$2" && ls -a\" \\"}' >> "$shell_shortcuts") \

Сценарий должен использовать текстовый файл .key_directories, игнорировать строки, начинающиеся с #, и пустые строки. затем в каждой строке добавьте необходимый текст и создайте новый файл с результатом.

пример: .key_directory

md /run/media

Сценарий создает текстовый файл .shortcuts с этим содержимым

alias \
md = cd /run/media

, а затем скрипт создает текстовый файл shortcuts.conf с таким содержанием:

map gmd cd /run/media
map tmd tab_new /run/media
map mmd shell mv -v %s /run/media
map Ymd shell cp -rc %s /run/media

Пока что я дважды проверил наличие дополнительных или отсутствующих пробелов. Также попытался поменять одинарные кавычки на двойные, а также удалить их. Но на самом деле ничего не работает, и я потратил уже несколько часов, пытаясь понять, как sed, tee и awk работают отдельно и вместе с кучей примеров, но я до сих пор не могу понять, почему скрипт перестал работать и как его исправить.

Если бы кто-нибудь мог помочь, это было бы здорово. Заранее спасибо.

РЕДАКТИРОВАТЬ: bash версия 5.0.7 / ZSH версия 5.7.1

1 Ответ

1 голос
/ 05 июля 2019

Похоже, ваш скрипт вызывается с /bin/sh.
Примечание: строка #! используется только в том случае, если скрипт вызывается с absolute_or_relative_path/script_name.sh.
Если вы назовете его sh absolute_or_relative_path/script_name.sh, он будет использовать /bin/sh в качестве переводчика.

...