2016-08-28 244 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:那也是我最好的猜測。 –