簡體   English   中英

哪個進程在終端中執行腳本

[英]Which process executes script in terminal

當我在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

您應該始終在腳本中包含shebang 如果您希望shell腳本由zsh運行,請確保腳本的最上一行如下所示:

#!/bin/zsh

這將確保您的腳本將由/bin/zsh (或在shebang中指定的任何其他可執行文件)執行。

如果要查找用於執行腳本的shell,請在其上添加以下行:

ps ho cmd $$

並查看其打印內容。 如果您想知道在交互式會話中使用了什么shell,請檢查是否定義了$BASH_VERSION$ZSH_VERSION

讓我們找出zsh用於執行文本文件的shell:

% 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

#! 這是一種通用機制,因此您可以使用它執行幾乎所有從stdin讀取的內容,並忽略以#開頭的“注釋”-perl,python,大多數shell,awk甚至gnuplot之類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM