我是使用zsh并使用Ranger作为文件管理器的Manjaro Linux上的新手。似乎脚本在更新之前就可以运行,但是不确定是否完全相关。
该脚本(shortcuts.sh)读取一个文件(.key_directories),该文件包含特定文件夹的路径列表。 每行包含几个字母和目录路径,即2列:
示例:
md /run/media/
mov /run/media/movies
docs /run/media/docs
然后添加一些文本,具体取决于列表最终将位于哪个文件中。文本文件(.shortcuts)(将用作bashrc和zshrc的别名列表)或文本文件(快捷方式)。 conf),将由护林员文件管理器用作不同文件夹路径的列表。
该脚本可以完美运行,直到无法运行为止。我不确定问题出在哪里。
这是完整的脚本shorcuts.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
答案 0 :(得分:1)
看起来您的脚本正在用/bin/sh
调用。
注意:仅在用#!
调用脚本时才使用absolute_or_relative_path/script_name.sh
行。
如果您将其称为sh absolute_or_relative_path/script_name.sh
,它将使用/bin/sh
作为解释器。