大概是這樣子,就是從一個 shell,根據使用者用的參數,要去背景執行另外一個 shell,然後要在一個 shell 內完成,因為不想在目錄出現一大堆 .sh。
也不算太難,只是有一個 -s 的參數,花了我不少時間。
結果就像這樣:
#!/bin/sh
name=$1
echo shell 1, name is $name PID $$
cat <<"EOF" | sh -s $name &
name2=$1
echo Engage shell named $name2/$name, PID $$
echo $$ > /tmp/${name2}.pid
while [ 1 ]
do
sleep 1
done
EOF
sleep 3
echo Kill $name
kill -TERM `cat /tmp/${name}.pid`
rm -f /tmp/${name}.pid
因為要在一個 shell 內完成,所以是用 cat <<"EOF" 的方法,把 shell pipe 給 sh 去執行,那要傳過去的參數呢?是用 -s 傳進去的。
If the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
執行結果:
要讚嘆一下微軟,那個 WSL (Windows Subsystem for Linux) 真是太方便了,我是安裝Alpine WSL,瞬間就可以啟動,試 shell 太方便了!