2016-09-19 56 views
0

哪個進程執行腳本?當我在MacOS終端中寫入./test1.sh時,哪個進程在終端執行腳本

我在我的機器上安裝了oh-my-zsh,從而在我的終端中運行zsh。

運行test1.sh像這樣:

./test1.sh 

輸出

1 март 2016/ 1 януари 2015/ 
1 март 2016/ 
./test3.sh: line 14: declare: -A: invalid option declare: usage: declare [-afFirtx] [-p] [name[=value] ...] 
./test3.sh: line 15: януари: syntax error: invalid arithmetic operator (error token is "?нуари") 
blah 

而這樣

zsh test3.sh 

輸出運行它

1 март 2016/ 
1 януари 2015/ 
blah 

在運行

declare -A newarray 
newarray[януари]="1" 
qn="януари" 
echo ${newarray[$qn]} 

輸出

1 

這是爲什麼另一方面?

test3.sh

# backup IFS 
SAVEIFS=$IFS 

# set IFS to newline 
IFS=$(echo -en "\n\b") 

# get files 
FILES=$(ls -1 -d */) 
echo ${FILES} 
IFS='\n' 
read dirsNameArray <<< ${FILES} 
echo ${dirsNameArray[0]} 

declare -A monthMap 
monthMap['януари']="1" 
# monthMap[февруари]="2" 
# monthMap[март]="3" 
# monthMap[април]="4" 
# monthMap[май]="5" 
# monthMap[юни]="6" 
# monthMap[юли]="7" 
# monthMap[август]="8" 
# monthMap[септември]="9" 
# monthMap[октомври]="10" 
# monthMap[ноември]="11" 
# monthMap[декември]="12" 


# iterate over files 
IFS='\n' 
for f in $FILES 
do 
    echo "blah" 
    IFS=' ' 
    # read -r dirNameArray <<< $f 
    # echo "${monthMap[${dirNameArray[2]}]}" 
    IFS='\n' 
done 

# restore $IFS 
IFS=$SAVEIFS 

回答

0

讓我們來看看什麼shell zsh的使用來執行文本文件:

% echo 'ps -f $$' > script.sh && chmod +x script.sh && ./script.sh 
UID  PID PPID C STIME TTY  STAT TIME CMD 
slim  17311 16570 0 15:45 pts/0 S+  0:00 sh ./script.sh 

所以它使用sh。這是有道理的,sh是最低的共同點,默認外殼。

要強制不同的外殼,在文本文件的第一行使用#!

% echo '#!/bin/zsh' > script.sh && echo 'ps -f $$' >> script.sh && chmod +x script.sh && ./script.sh 
UID PID PPID C STIME TTY  STAT TIME CMD 
slim 17342 16570 0 15:46 pts/0 S+  0:00 /bin/zsh ./script.sh 

#!是一個通用的機制,所以你可以用它來執行幾乎任何東西,從標準輸入讀取和忽略從#開始的「註釋」 - perl,python,大多數shell,awk,甚至像gnuplot這樣的東西。

+0

謝謝我的男人:)是有道理的。 – mp3por

2

你應該總是在您的腳本shebang。如果你希望你的shell腳本由zsh中運行,那麼請確保您腳本的最上一行看起來像這樣:

#!/bin/zsh 

這將保證你的腳本將被/bin/zsh你指定的任何其他可執行文件執行(或在shebang)。

如果你想找出外殼是用來執行腳本,下面的行添加到它:

ps ho cmd $$ 

,看看它打印。如果您想知道交互式會話中使用了什麼外殼,請檢查是否定義了$BASH_VERSION$ZSH_VERSION

+1

我可以同意這是解決方案。但它不回答這個問題... – mp3por

+0

@ mp3por我誤解了你的問題。看到我更新的答案。 – redneb