Я новичок в 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