哪个进程在终端中执行脚本
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 脚本成为 运行 by zsh
然后确保你脚本的最上面一行看起来像这样:
#!/bin/zsh
这将保证您的脚本将由 /bin/zsh
(或您在 shebang 中指定的任何其他可执行文件)执行。
如果您想找出 shell 用于执行脚本的内容,请向其中添加以下行:
ps ho cmd $$
看看它打印了什么。如果您想知道在交互式会话中使用了什么 shell,请检查是否定义了 $BASH_VERSION
或 $ZSH_VERSION
。
让我们看看 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
是最小公分母,默认shell。
要强制使用不同的 shell,请在文本文件的第一行使用 #!
:
% 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
#!
是一种通用机制,因此您可以使用它来执行几乎所有从标准输入读取并忽略以 #
开头的 "comments" -- perl, python,大多数 shells,awk,甚至像 gnuplot 这样的东西。
当我在 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 脚本成为 运行 by zsh
然后确保你脚本的最上面一行看起来像这样:
#!/bin/zsh
这将保证您的脚本将由 /bin/zsh
(或您在 shebang 中指定的任何其他可执行文件)执行。
如果您想找出 shell 用于执行脚本的内容,请向其中添加以下行:
ps ho cmd $$
看看它打印了什么。如果您想知道在交互式会话中使用了什么 shell,请检查是否定义了 $BASH_VERSION
或 $ZSH_VERSION
。
让我们看看 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
是最小公分母,默认shell。
要强制使用不同的 shell,请在文本文件的第一行使用 #!
:
% 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
#!
是一种通用机制,因此您可以使用它来执行几乎所有从标准输入读取并忽略以 #
开头的 "comments" -- perl, python,大多数 shells,awk,甚至像 gnuplot 这样的东西。