bashrc 中的别名返回语法错误

bashrc 中的别名返回语法错误

我正在使用带有 bash 的 archlinux。我一直在尝试创建一个新的别名,但bashrc不喜欢我的花括号。下面的命令应该计算.mkv我目录中每个视频的持续时间长度(深度=3)并将其转换为小时。

alias vidlength="find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc | awk '{print(($1/60)/60)}'"

当我运行源代码$ source ~/.bashrc$ vidlength随后运行它时,出现此错误:

awk: cmd. line:1: {print((/60)/60)}
awk: cmd. line:1:                 ^ syntax error

Bashrc 和类似的东西对我来说相当新,我在谷歌上找不到任何类似的问题。任何帮助都非常感谢。:)

答案1

该问题与您的“花括号”无关。

您过去常常引用整个别名值,因此在 awk 中您想要表示“字段 1”的"字符串被扩展为$1别名定义时的 shell 参数 1这是一个空值;因此表达式((/60)/60)毫无意义——您试图将某个值除以 60,但结果为空。您可以用反斜杠将 括起来$,或者您可以使用技巧,即 awk 字段引用在带有空格的情况下仍能正常工作,例如$ 1或 ,$ NF而 shell 参数则不行。

或者,使用 shell 函数(接受完整的 shell 语法)而不是别名(要求将所有内容打包成一个字符串):

function vidlength {
    find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | 
    paste -sd+ -| bc | awk '{print(($1/60)/60)}'
}

此外,您可以通过让 awk 执行加法而不是单独的 bc 来简化此过程,并且不需要所有括号:

 find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | 
 awk '{tot+=$ 1} END{print tot/3600}'
 # I used the $ 1 syntax to allow use in alias, can use $1 in function

相关内容