bash单独工作,但在屏幕上运行时失败

时间:2018-09-04 04:18:43

标签: bash shell gnu-screen

我有一个以以下内容开头的bash脚本

for d in /data/mydata/*; do
    echo $d
    filepath=$(echo $d | tr "/" "\n")
    pathArr=($filepath)       # fails here
    echo ${pathArr[-1]}

当我仅在命令行中调用时,它运行良好

./run_preprocess.sh

但是当我使用屏幕运行它时

screen -dmSL run_preproc ./run_preprocess.sh

在该pathArr行上失败

./run_preproc.sh: 7: ./run_preproc.sh: Syntax error: "(" unexpected (expecting "done")

我需要做些保护脚本代码的事情吗?

1 个答案:

答案 0 :(得分:1)

基于该错误,看起来您正在使用POSIX sh而不是bash运行脚本。数组在POSIX sh中未定义。

要解决此问题,请在脚本中添加适当的hashbang(例如/usr/bin/env bash,或直接使用Bash解释器运行脚本(例如/bin/bash script.sh)。


此外(与手头的问题无关),您的脚本(或发布的摘录)还存在多个潜在问题:

    应使用
  • 变量加引号,以防止乱序和单词拆分(例如,考虑d-您的文件之一-包含*-echo $d将包括所有文件的列表) ,因为*将被展开)

  • 使用($var)拆分成数组是在任何IFS字符上完成的,而不仅仅是换行符。 IFS默认包含空格,制表符和换行符。建议在read -a上使用mapfile($var)

最后,如果您要尝试获取路径(文件名)中的最后一个组件,则应考虑使用basename(1)

$ basename /path/to/file
file
Bash参数扩展的

substring removal语法:

$ path=/path/to/file
$ echo "${path##*/}"
file