如何修复 sed tee awk 语法?

How to fix sed tee awk syntax?

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

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

示例:

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

然后添加一些文本,这取决于列表将在哪个文件中结束。要么是一个文本文件(.shortcuts),它将用作 bashrc 和 zshrc 的别名列表或一个文本文件 (shortcuts.conf),Ranger 文件管理器将其用作不同文件夹的路径列表。

该脚本在出现问题之前一直运行良好。我不确定问题出在哪里。

这是完整的脚本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 "" "")>/dev/null 2>&1 || echo "" >> "" ;}

    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 "=\"cd "" && ls -a\" \"}' >> "$shell_shortcuts") \
        | awk '{print "map g"" cd ""\nmap t"" tab_new ""\nmap m"" shell mv -v %s ""\nmap Y"" shell cp -rv %s "}' >> "$ranger_shortcuts"

    # Format the `configs` file in the correct syntax and sent it to both configs.
    sed "s/#.*$//;/^$/d"  "$configs" | tee >(awk '{print "=\"$EDITOR ""\" \"}' >> "$shell_shortcuts") \
        | awk '{print "map "" shell $EDITOR "}' >> "$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 "=\"cd "" && 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

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