如何修复sed tee awk语法?

时间:2019-07-04 11:36:39

标签: bash zsh manjaro

我是使用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

1 个答案:

答案 0 :(得分:1)

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