0

我是使用 zsh 并使用 ranger 作为文件管理器的 Manjaro Linux 的新手。似乎该脚本在更新之前正在运行,但不确定它是否完全相关。

脚本 (shortcuts.sh) 读取包含特定文件夹路径列表的文件 (.key_directories)。每行包含几个字母和一个目录路径,即 2 列:

例子:

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

然后添加一点文本,这取决于列表最终将在哪个文件中。将用作 bashrc 和 zshrc 别名列表的文本文件 (.shortcuts) 或文本文件 (shortcuts.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

4

1 回答 1

1

看起来你的脚本是用/bin/sh.
注意:#!仅当使用 调用脚本时才使用该行absolute_or_relative_path/script_name.sh
如果您将其称为sh absolute_or_relative_path/script_name.sh,它将/bin/sh用作解释器。

于 2019-07-05T04:05:48.647 回答