【问题标题】:Which process executes script in terminal哪个进程在终端中执行脚本
【发布时间】:2016-09-19 14:28:31
【问题描述】:

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

【问题讨论】:

    标签: bash zsh


    【解决方案1】:

    您应该始终在脚本中包含shebang。如果您希望您的 shell 脚本由 zsh 运行,请确保您的脚本的最上面一行如下所示:

    #!/bin/zsh
    

    这将保证您的脚本将由 /bin/zsh(或您在 shebang 中指定的任何其他可执行文件)执行。

    如果您想找出执行脚本所使用的 shell,请添加以下行:

    ps ho cmd $$
    

    看看它打印了什么。如果您想知道交互式会话中使用的 shell,请检查是否定义了 $BASH_VERSION$ZSH_VERSION

    【讨论】:

      【解决方案2】:

      让我们看看 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 是最小的公分母,默认 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
      

      #! 是一种通用机制,因此您可以使用它来执行几乎任何从标准输入读取并忽略以# 开头的“cmets”的东西——perl、python、大多数 shell、awk,甚至像gnuplot。

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2011-01-11
        • 2011-04-13
        • 1970-01-01
        • 2013-01-31
        相关资源
        最近更新 更多