如何修复 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
作为解释器。
我是 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
作为解释器。