获取Bash中带有空格的脚本路径

获取Bash中带有空格的脚本路径,bash,directory,Bash,Directory,我在MacOS El Capitan 10.10.6下运行它 在获取当前目录(运行脚本的路径)的所有命令中,只有以下命令对我有效: FILES="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 但是,如果文件夹名称中有空格(也称为“文件夹名称”),则它将不起作用 如何解决这个问题 谢谢 更新:添加脚本: #!/bin/bash function check () { oldsize=`wc -c <"$1"`

我在MacOS El Capitan 10.10.6下运行它

在获取当前目录(运行脚本的路径)的所有命令中,只有以下命令对我有效:

FILES="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
但是,如果文件夹名称中有空格(也称为“文件夹名称”),则它将不起作用

如何解决这个问题

谢谢

更新:添加脚本:

    #!/bin/bash

function check ()
{
oldsize=`wc -c <"$1"`
sleep 1
newsize=`wc -c <"$1"`

while [ "$oldsize" -lt "$newsize" ]
do
 echo "Not yet..."
oldsize=`wc -c <"$1"`
sleep 1
newsize=`wc -c <"$1"`
done

if [ "$oldsize" -eq "$newsize" ]
then
   echo "The file has been copied completely."
fi
}


FILES="$(dirname "${BASH_SOURCE[0]}")/*"


function main
{

for f in $FILES
do

if [[ "$f" =~ \.mkv$ ]];
then
#/////////////////////////////////////////////////////////////////////

 check "$f"
 (( count = count + 1 ))
 g="${f/mkv/avi}"

 #LOG_FILE="${g/avi/log}"

 #exec > >(tee -a "${LOG_FILE}" )
 #exec 2> >(tee -a "${LOG_FILE}" >&2)

 now="$(date)"
 printf "Current date and time %s\n" "$now"

   echo "Processing $f file..."

   #avconv -i "${f}" -map 0:0 -map 0:1 -codec copy -sn "${g}"
   avconv -i "$f" -map 0 -codec copy "$g"
if [ $? -eq 0 ]; then
    echo OK
    rm "$f"
else
    echo FAIL
    rm "$g"
    #rm "$LOG_FILE"
    return
fi

fi
#/////////////////////////////////////////////////////////////////////

done

}

############
count=0
############

main

if (($count > 0)); then
open "$(dirname "${BASH_SOURCE[0]}")"
fi

exit
#/bin/bash
函数检查()
{
oldsize=`wc-c(tee-a“${LOG_FILE}”>&2)
now=“$(日期)”
printf“当前日期和时间%s\n”“$now”
echo“正在处理$f文件…”
#avconv-i“${f}”-映射0:0-映射0:1-编解码器副本-sn“${g}”
avconv-i“$f”-映射0-编解码器副本“$g”
如果[$?-eq 0];则
回声OK
rm“$f”
其他的
回音失败
rm“$g”
#rm“$LOG\u文件”
返回
fi
fi
#/////////////////////////////////////////////////////////////////////
完成
}
############
计数=0
############
主要的
如果($count>0));然后
打开“$(dirname“${BASH_SOURCE[0]}”)
fi
出口

我正在使用Mac OS X 10.11.6,我有一个目录
$HOME/tmp
。在那里,我执行:

$ cd $HOME/tmp
$ pwd
/Users/jleffler/tmp
$ mkdir -p "Spaced Out  Directory   "/bin
$ export PATH="$PATH:$PWD/$_"
$ cat <<'EOF' > Spaced\ Out\ \ Directory\ \ \ /bin/gorblinsky.sh
> #!/bin/bash
> 
> echo "PWD=$PWD"
> DIR="$(dirname "${BASH_SOURCE[0]}")"
> echo "DIR=$DIR"
> cd "$DIR"
> pwd
> echo "PWD=$PWD"
> EOF
$ chmod +x Spaced\ Out\ \ Directory\ \ \ /bin/gorblinsky.sh 
$ gorblinsky.sh
PWD=/Users/jleffler/tmp
DIR=/Users/jleffler/tmp/Spaced Out  Directory   /bin
/Users/jleffler/tmp/Spaced Out  Directory   /bin
PWD=/Users/jleffler/tmp/Spaced Out  Directory   /bin
$

现代风格是总是(双重)引用所有变量引用,即使其中没有需要保护的内容(参见示例-和)。我已经够老派了,不会在不能包含空格或元字符的名称周围加引号,但我想这只是过时的做法。例如,我在shell中检查了一个脚本,用于处理RCS版本号,它没有引用包含虚线数字串的变量(9.19.2.24-也可能是IBM IPv4地址),我因为没有引用它们而被训斥,尽管文件名已经用引号保护。

您的意思是?您是在寻找保存脚本源的目录,还是在寻找运行脚本的进程的当前目录?你的术语有点混乱。只是
DIRECTORY=“$(dirname“${BASH_SOURCE[0]}”)”
(有很多引号和括号)有什么问题。请注意,您命令中的
cd
是在子shell中运行的,因此不会影响父shell进程。您所说的“脚本是从中运行的”是什么意思?它充其量是模棱两可的;最糟糕的情况是,没有意义。您的意思是“包含正在运行的脚本的源代码的目录”?或者你的意思是“运行脚本的进程的当前目录”?当你以后使用它时,你是否引用了
文件
?我不知道你做错了什么,但我刚刚向你展示了,
$(dirname“${BASH_SOURCE[0]}”)
命令可以正常工作。您是否记得总是引用分配给它的变量?路径中有空格时,您必须始终引用文件名。也许我们没有看到的原始脚本中缺少了
cd“$DIR”
中的引号?@choroba:这也是我最好的猜测。
cp "$DIR/gorblinksky.h" "$HOME/tmp/cobbled together name"