ls`命令将带有空格的目录解释为多个目录

问题描述 投票:0回答:1

我正在尝试传递一个动态命令,该命令将ls作为字符串执行,该字符串列出了包含空格的目录文件。但是,无论我做什么,我的ls命令总是将我的包含空格的目录解释为多个目录。

考虑以下简化版的Shell脚本:

#!/bin/sh

export WORK_DIR="/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work"
echo "WORK_DIR=$WORK_DIR"

export LS_CMD="ls -A \"$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs\""
echo "LS_CMD=$LS_CMD"

if [ -n "$($LS_CMD)" ]
then
    echo "### Removing all logs"
    sudo rm "$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs/*"
else
    echo "### Not removing all logs"
fi

此脚本产生以下输出:

WORK_DIR=/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work
LS_CMD=ls -A "/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work/dependencies/apache-tomcat-8.0.45/logs"
ls: "/Users/jthoms/Dropbox: No such file or directory
ls: (My: No such file or directory
ls: Company)/backup-jthoms/Work/dependencies/apache-tomcat-8.0.45/logs": No such file or directory
### Not removing all logs

如何正确地转义我的shell变量,以便ls命令将目录解释为包含空格而不是多个目录的单个目录?

我最近更改了此脚本,该脚本过去对于在不包含空格的目录中都可以正常使用,但现在不适用于这种新情况。我正在MacOSX上开发Bash。我曾尝试过各种形式的转义,各种Google搜索以及在此处搜索类似问题的方法,但均无济于事。请帮助。

bash escaping ls
1个回答
0
投票

变量用于数据。函数用于代码。

# There's no apparent need to export this shell variable.
WORK_DIR="/Users/jthoms/Dropbox (My Company)/backup-jthoms/Work"
echo "WORK_DIR=$WORK_DIR"

ls_cmd () {
  ls -A "$1"/dependencies/apache-tomcat-8.0.45/logs
}

if [ -n "$(ls_cmd "$WORK_DIR")" ]; then
then
  echo "### Removing all logs"
  sudo rm "$WORK_DIR/dependencies/apache-tomcat-8.0.45/logs/"*
else
  echo "### Not removing all logs"
fi

但是,您根本不需要ls(通常,您应该avoid parsing the output of ls)。例如,

ls
© www.soinside.com 2019 - 2024. All rights reserved.