bash 单独工作,但在 运行 出现在屏幕上时失败
bash works alone but fails when running in 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")
我需要做些什么来保护脚本代码吗?
根据错误,您似乎是 运行使用 POSIX sh
而不是 bash
设置脚本。 POSIX sh
.
中未定义数组
要解决此问题,请在脚本中添加适当的 hashbang(例如 /usr/bin/env bash
,或 运行 直接使用 Bash 解释器(例如 /bin/bash script.sh
)的脚本。
此外(与手头的问题无关),您的脚本(或发布的代码片段)有几个潜在问题:
变量应该被引用以防止通配和分词(例如考虑 d
- 你的一个文件 - 包含 *
- echo $d
将包含一个所有文件的列表,因为 *
将被展开)
用 ($var)
分割成数组是在任何 IFS
字符上完成的,而不仅仅是换行符。 IFS
默认包含 space、制表符和换行符。建议使用 read -a
或 mapfile
而不是 ($var)
。
最后,如果您正在尝试获取路径中的最后一个组件(文件名),您应该考虑使用 basename(1)
:
$ basename /path/to/file
file
或 substring removal Bash 参数扩展的语法:
$ path=/path/to/file
$ echo "${path##*/}"
file
我有这个 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")
我需要做些什么来保护脚本代码吗?
根据错误,您似乎是 运行使用 POSIX sh
而不是 bash
设置脚本。 POSIX sh
.
要解决此问题,请在脚本中添加适当的 hashbang(例如 /usr/bin/env bash
,或 运行 直接使用 Bash 解释器(例如 /bin/bash script.sh
)的脚本。
此外(与手头的问题无关),您的脚本(或发布的代码片段)有几个潜在问题:
变量应该被引用以防止通配和分词(例如考虑
d
- 你的一个文件 - 包含*
-echo $d
将包含一个所有文件的列表,因为*
将被展开)用
($var)
分割成数组是在任何IFS
字符上完成的,而不仅仅是换行符。IFS
默认包含 space、制表符和换行符。建议使用read -a
或mapfile
而不是($var)
。
最后,如果您正在尝试获取路径中的最后一个组件(文件名),您应该考虑使用 basename(1)
:
$ basename /path/to/file
file
或 substring removal Bash 参数扩展的语法:
$ path=/path/to/file
$ echo "${path##*/}"
file