2016-08-28 192 views
-1

我运行它在MacOS埃尔卡皮坦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 
+1

你的意思是[*空格*](https://en.wikipedia.org/wiki/Whitespace_character)? – hek2mgl

+1

您正在查找保存脚本来源的目录,还是查找运行脚本的进程的当前目录?你的术语有点混乱。 “DIRECTORY =”$(dirname“$ {BASH_SOURCE [0]}”)“'(这是很多引号和括号)出了什么问题。请注意,命令中的“cd”运行在子shell中,因此不会影响父shell进程。 –

+0

我想要从脚本运行的目录得到 – user3027198

回答

3

我使用的是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 
$ 

这表明命令$(dirname "${BASH_SOURCE[0]}")可以确定其中该命令的源的存储目录的名称。

如果脚本要使用变量$DIR指定文件名,则需要小心(非常小心)以确保始终正确引用它。

例如:

cp "$DIR/gorblinksky.h" "$HOME/tmp/cobbled together name" 

现代的风格是永远(双)引号的所有变量引用,即使有什么在他们需要保护(见shellcheck.net例如 - 和Google Shell Style Guide)。我已经足够老了,不要在不能包含空格或元字符的名称周围加引号,但我想这只是老式的。例如,我对使用RCS版本号的脚本进行shell检查,并且它不会引用包含数字的虚线字符串的变量(9.19.2.24 - 也可能是IBM的IPv4地址),并且我被告知不引用它们,尽管文件名已经用引号保护了。

+1

也许'cd“$ DIR”'中的引号在我们没有看到的原始脚本中丢失了? – choroba

+1

@choroba:那也是我最好的猜测。 –