Shell脚本中mkdir赋值失败与mktemp命令的用法差异问题
问题原因
$() 语法的作用是捕获内部命令的标准输出(stdout),并将输出内容赋值给变量,两种命令的行为差异导致了写法效果不同:
mktemp -d命令的设计逻辑是:成功创建临时目录后,会自动将新创建的目录的完整路径打印到标准输出,因此$(mktemp -d)可以正确捕获路径赋值给变量mkdir命令的设计逻辑是:执行成功时没有任何标准输出,只有报错时才会将错误信息输出到标准错误(stderr,默认不会被$()捕获),因此WORKDIR=$(mkdir $SUBDIR/$BASENAME)执行完后WORKDIR变量是空值,后续[[ -d $WORKDIR ]]判断自然会失败。
正确的简化写法
如果想把目录创建和变量赋值合并为一行,可以用如下写法,同时记得给变量加双引号避免路径含空格时报错:
WORKDIR="$SUBDIR/$BASENAME" && mkdir -p "$WORKDIR"
这里加-p参数还可以避免目录已经存在时报错中断脚本,你可以根据需求选择是否添加。
内容的提问来源于stack exchange,提问作者Cdc95
相关产品推荐
相关产品推荐

