ç¾å¨ã® shell ã shellscript ã®ä¸ãã確èªãã(Linux, BSD 両対å¿)
ç¾å¨ã® shell(以ä¸ãcurrent shell) ã確èªããæ¹æ³ã¨ãã¦çã£å ã«æãæµ®ãã¶ã®ã¯ä»¥ä¸ã ã¨æãã¾ãã
$ echo $SHELL /bin/bash
ãã ãããã¯ä¸æ£è§£ã§ã$SHELL ã¯ããã¾ã§ã login shell ã§ãã®ã§ã
login shell 㨠current shell ãéãå ´åã¯æ£ããå¤ãè¿ãã¦ããã¾ããã
ç§ã®å ´åã§ãã¨ããã¼ã«ã«ç°å¢ã§å¸¸æå©ç¨ãã¦ããã®ã¯ zsh ã§ããã
login shell 㯠bash ã§ã(zsh ã login shell ã«ããã¨éãã¨æãã¦ããã ãããã¨ãããã®ã§)ã
ãã®ãããªã±ã¼ã¹ã§ãæ£ããå¤ãè¿ãæ¹æ³ã以ä¸ã§ãã
$ echo $0 -zsh
shell ä¸ã§ã¯ $0 ã« current shell ãæ ¼ç´ããã¦ãã¾ãã
ããã§è§£æ±ºããã°è¯ãã®ã§ãããshellscript å
ã§ç¢ºèªãããã¨æãã¨è©±ãã¯å¤ãã£ã¦ãã¾ãã
shellscript å
㧠$0 ã«ã¯ãscript åãæ ¼ç´ããã¦ãã¾ãã
shell ä¸ã§ã®å©ç¨ããããshellscript å
ã§ã®å©ç¨é »åº¦ã®æ¹ãé«ãã§ãããããããã§ã¯å°ãã¾ãã
è²ã
調ã¹ã¦ãããã現在使っているシェルの名前を知る方法 - 揮発性のメモ ãçºè¦ãã¾ããã
ããããåèã«ãªãã¾ããããããã¨ããããã¾ãã
readlink /proc/$$/exe
ã®èª¬æãããã¨ã
Linux ã® /proc/PID 以ä¸ã«ã¯ãããã»ã¹ã«é¢ããæ
å ±ãè²ã
å
¥ã£ã¦ãã¦ã
- $$ 㧠shellscript èªèº«ã® PID ãåå¾ãã¦ã
- ã·ã³ããªãã¯ãªã³ã¯ã®å®ä½ã®ãã¹ãè¿ã readlink ã«ã
- ã³ãã³ãã®ãã¹ã®ã·ã³ããªãã¯ãªã³ã¯ãå«ã¾ãã¦ãã /proc/$$/exe ã渡ãã¦ã
- shellscript ãå®è¡ãã¦ãã shell ãåå¾ãã
ã¨ãªãã¾ãã
ããã§è§£æ±ºãã¨æãã¾ãããã以ä¸ã®æ¬ ç¹ãããã¾ãã
- /proc ã Linux ã«ãããªã(ãã¶ã)
- å®è¡ããæã® shell ã«ãªãã®ã§ãcurrent shell ã¨ã¯éã
2ç¹ç®ã«ã¤ãã¦èª¬æããã¨ã
shebang ã« #!/bin/bash ã¨æå®ãã¦ã¹ã¯ãªãããå®è¡ãããã
bash /path/to/script ã®ããã«å®è¡ããã¨ãzsh ã使ã£ã¦ãã¦ã /bin/bash ãè¿ã£ã¦ãããã¨ãããã¨ã§ãã
ä»åã¯ãããã¾ã§ã current shell ãåå¾ãããã®ã§ããã§ã¯è¦ä»¶ãæºããã¾ããã
解決ç
å®è¡ãã shellscript ã®è¦ªããã»ã¹ã¯ current shell ã«ãªã£ã¦ããã®ã§ã¯ãªããã
ã¨å½ãããã¤ãã¦å®é¨ãããã§ãã¾ããã
以ä¸ãã¹ã¯ãªããã§ãã
2ã¤ç®ã®ã¹ã¯ãªããã¯ãæ´»ç¨ä¾ã§ãã
1ã¤ãã¤èª¬æããã¨ã
_PID=$$
㧠Shellscript èªèº«ã® PID ãåå¾ãã¦ã
_PPID=$(ps -o ppid -p $_PID | tail -n 1)
ã§ãShellscript èªèº«ã®è¦ªPID(PPID)ãåºåãã¦ãã¾ãã
ãããæ´ã«å解ããã¨ã
$ ps -o ppid -p $_PID PPID 12345
ã®ãããªåºåã«ãªãã®ã§ã
tail -n 1
㧠2 è¡ç®ã ãåºåãã¦ããããã«ãã¦ãã¾ãã
--no-headers ã使ã£ã¦ããªãçç±ã¯ BSD ã® ps ã«ãªãã£ãããã§ãã
ãã¨ã¯ã親PIDãåããã®ã§ã
ps -p $_PPID
㧠PID æå®ã§ ps ãã¦ãã¾ãã
ãã㧠å®è¡ãã shellscript ã®è¦ªããã»ã¹ã®æ
å ±ãåå¾åºæ¥ã¾ããã
zsh ã使ã£ã¦ããç¶æ ã§ãããå®è¡ããã¨ã
$ ./get_current_shell.sh PID TTY TIME CMD 12345 pts/1 00:00:00 zsh
ã¨ãªãã¾ãã
header ãæ¶ããããã°ãåãè¦é 㧠tail ããã¾ããã°ããã§ãããã
ãã¨ã¯ãgrep -qs zsh ã«ãããããã° zshãgrep -qs bash ã«ãããããã° bash
ã¨ãã£ãå¤å®ãå¯è½ã«ãªãã¾ãã
ã¾ã¨ã
login shell 㨠current shell ãéãå ´åãã
å®è¡æã® shell 㨠current shell ãéãå ´åã§ããcurrent shell ãè¿ãæ¹æ³ã示ãã¾ããã
ããã»ã©ä½¿ãéã¯ãªãããããã¾ãããã
.bashrc ã .zshrc ãèªã¿ç´ãããã追è¨ãããã¨ãã«ã
login shell 㨠current shell ãéãå ´åã§ããé©åãªãã¡ã¤ã«ã«å¯¾ãã¦å¦çãè¡ããã§ãããã
Linux ã ãã§ãªã BSD ã§ãåãããã«ãã¾ããã®ã§ãæ±ç¨çã«ä½¿ããã®ã§ã¯ãªããã¨æãã¾ãã
追è¨1
@hnakamur2 ããã«ãawk 㧠2è¡ç®ãã ããåºåãããããã
tail -n 1 ã®ã»ããã·ã³ãã«ã ã¨ãææããã ãã¾ããã®ã§ä¿®æ£ãã¾ããã
ãææãããã¨ããããã¾ãï¼
Linux, BSD ã§æ¤è¨¼ãã¦åä½ãããã¨ã確èªæ¸ã¿ã§ãã
# è¨æ£å _PPID=$(ps -o ppid -p $_PID | awk 'NR==2 { print }') # è¨æ£å¾ _PPID=$(ps -o ppid -p $_PID | tail -n 1)
追è¨2
@songmu ãããããææé ãã¾ããã
ãããã¨ããããã¾ãï¼
shellscript(親shellscript) ã®ä¸ã§ shellscript(åshellscript) ãå¼ã³åºãå ´åã¯ã
åshellscript ããè¦ã親ããã»ã¹ã¯ã親shellscript ã¨ãªã£ã¦ãã¾ãã¾ãã
ãããã£ã¦ãæ£ããåä½ãã¾ããã
ç¾ç¶ã§ã¯ãã¾ã 解決ã§ãã¦ãã¾ãããã
current shell å¤å®å¦çãé¢æ°åãã¦å¥ãã¡ã¤ã«ã«ãã
. get_current_shell.sh
get_current_shell
ã®ããã«èªã¿è¾¼ãã§ãåshellscript ããå¼ã°ãªãããã«ããããããã¾ããã
解決ã§ããã追è¨è´ãã¾ãã