ฉันจะกำหนดเชลล์ปัจจุบันที่ฉันกำลังใช้งานได้อย่างไร
ผลลัพธ์ของps
คำสั่งเพียงอย่างเดียวจะเพียงพอหรือไม่
สิ่งนี้สามารถทำได้ใน Unix รสชาติที่แตกต่างกันอย่างไร
ฉันจะกำหนดเชลล์ปัจจุบันที่ฉันกำลังใช้งานได้อย่างไร
ผลลัพธ์ของps
คำสั่งเพียงอย่างเดียวจะเพียงพอหรือไม่
สิ่งนี้สามารถทำได้ใน Unix รสชาติที่แตกต่างกันอย่างไร
คำตอบ:
มีสามวิธีในการค้นหาชื่อของไฟล์สั่งการของเชลล์ปัจจุบัน:
โปรดทราบว่าวิธีการทั้งสามนี้อาจถูกหลอกได้หากมีการเรียกใช้งานเชลล์ได้/bin/sh
แต่เป็นชื่อที่เปลี่ยนไปจริง ๆbash
(ซึ่งเกิดขึ้นบ่อยครั้ง)
ดังนั้นคำถามที่สองของคุณว่าการps
ตอบสนองจะทำอย่างไรกับ " ไม่เสมอไป "
echo $0
- จะพิมพ์ชื่อโปรแกรม ... ซึ่งในกรณีของเชลล์คือเชลล์จริง
ps -ef | grep $$ | grep -v grep
- สิ่งนี้จะค้นหา ID กระบวนการปัจจุบันในรายการกระบวนการที่กำลังทำงาน เนื่องจากกระบวนการปัจจุบันคือเชลล์จึงจะรวมอยู่
สิ่งนี้ไม่น่าเชื่อถือ 100% เนื่องจากคุณอาจมีกระบวนการอื่น ๆที่ps
รายการมีหมายเลขเดียวกันกับ ID กระบวนการของเชลล์โดยเฉพาะถ้า ID นั้นมีจำนวนน้อย (ตัวอย่างเช่นหาก PID ของเชลล์คือ "5" คุณอาจพบกระบวนการที่เรียกว่า "java5" หรือ "perl5" ในgrep
เอาต์พุตเดียวกัน!) นี่เป็นปัญหาที่สองด้วยวิธีการ "ps" ที่ด้านบนของความไม่สามารถพึ่งพาชื่อเชลล์
echo $SHELL
- เส้นทางไปยังเชลล์ปัจจุบันจะถูกเก็บไว้เป็นSHELL
ตัวแปรสำหรับเชลล์ใด ๆ ข้อแม้สำหรับอันนี้คือถ้าคุณเรียกใช้เชลล์อย่างชัดเจนว่าเป็น subprocess (ตัวอย่างเช่นไม่ใช่เชลล์ล็อกอินของคุณ) คุณจะได้รับค่าเชลล์ล็อกอินของคุณแทน หากเป็นไปได้ให้ใช้วิธีการps
หรือ$0
อย่างไรก็ตามหากปฏิบัติการไม่ตรงกับเปลือกจริงของคุณ (เช่น/bin/sh
จริง ๆ แล้วทุบตีหรือ ksh) คุณต้องมีการวิเคราะห์พฤติกรรม นี่คือตัวแปรสภาพแวดล้อมบางตัวสำหรับเชลล์ต่างๆ:
$version
ตั้งอยู่บน tcsh
$BASH
ตั้งอยู่บนทุบตี
$shell
(ตัวพิมพ์เล็ก) ถูกตั้งค่าเป็นชื่อเชลล์จริงใน csh หรือ tcsh
$ZSH_NAME
ตั้งอยู่บน zsh
ksh มี$PS3
และ$PS4
ตั้งค่าในขณะที่เชลล์เป้าหมายปกติ ( sh
) มี$PS1
และ$PS2
ตั้งค่าเท่านั้น ซึ่งมักจะดูเหมือนยากที่จะแยกแยะความแตกต่าง - The เพียงความแตกต่างในการตั้งค่าทั้งหมดของตัวแปรสภาพแวดล้อมระหว่างsh
และksh
เราได้ติดตั้งบน Solaris boxen คือ$ERRNO
, $FCEDIT
, $LINENO
, $PPID
, $PS3
, $PS4
, $RANDOM
, และ$SECONDS
$TMOUT
echo ${.sh.version}
ส่งคืน "การทดแทนไม่ดี" ดูโซลูชันของฉันด้านบน
ps -ef | grep …
... นี่คือไม่ 100% ที่เชื่อถือได้เป็น ...” การใช้การแสดงออกปกติโดยง่ายผ่านทางegrep
หรือgrep -e
สามารถนำความน่าเชื่อถือขึ้นไปสำหรับทุกเจตนาและวัตถุประสงค์ ps -ef | egrep "^\s*\d+\s+$$\s+"
100%: สิ่งที่^
ทำให้แน่ใจว่าเราเริ่มต้นจากจุดเริ่มต้นของบรรทัด\d+
กิน UID ขึ้น$$
ตรงกับ PID และ\s*
และ\s+
บัญชีสำหรับ & ตรวจสอบช่องว่างระหว่างส่วนอื่น ๆ
ps -ef | awk '$2==pid' pid=$$
ps -p $$
ควรทำงานได้ทุกที่ที่โซลูชั่นที่เกี่ยวข้องps -ef
และgrep
ทำ (ในตัวแปร Unix ใด ๆ ที่สนับสนุนตัวเลือก POSIX สำหรับps
) และจะไม่ได้รับผลกระทบจากผลบวกปลอมที่เกิดขึ้นจากการ grepping สำหรับลำดับตัวเลขซึ่งอาจปรากฏที่อื่น
ps
ซึ่งอาจจะไม่เข้าใจดังนั้นคุณอาจจำเป็นต้องใช้-p
/bin/ps -p $$
$$
ยกเว้นที่คุณจะต้องใช้fish
ps -p %self
/bin/ps
ที่จริงแล้วคุณไม่ควรพึ่งพาเส้นทางแข็งเช่น ps
ได้อย่างง่ายดาย (ที่จริงมันเป็นเรื่องปกติมากในปัจจุบัน) /usr/bin
ได้รับการติดตั้งใน $(which ps) -p $$
เป็นวิธีที่ดีกว่า แน่นอนว่าสิ่งนี้จะไม่ทำงานในปลาและอาจเป็นเปลือกหอยอื่น ๆ ฉันคิดว่ามันอยู่(which ps) -p %self
ในปลา
readlink /proc/$$/exe
sh
ถูกจำลองโดยbash
ps-p ให้คุณ/usr/bin/bash
แม้คุณจะเรียกใช้เป็นsh
ลอง
ps -p $$ -oargs=
หรือ
ps -p $$ -ocomm=
ps -o fname --no-headers $$
ผมใช้ตัวเอง
test `ps -p $$ -ocomm=` == "bash" && do_something_that_only_works_in_bash
ฉันพบนี้เป็นตัวเลือกที่ดีที่สุดในการใช้งานในสคริปต์คำสั่งเฉพาะยามทุบตี (บรรทัดถัดไปในสคริปต์ของฉันมีค่าเทียบเท่ากับ csh.)
-q
แทน-p
:SHELL=$(ps -ocomm= -q $$)
หากคุณเพียงต้องการให้แน่ใจว่าผู้ใช้กำลังเรียกใช้สคริปต์ด้วย Bash:
if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi
#!/bin/bash
: if [ ! -n "$BASH" ] ;then exec bash $0; fi
. ด้วยบรรทัดนี้สคริปต์จะรันโดยใช้ bash แม้ว่าจะเริ่มใช้ ksh หรือ sh กรณีใช้งานของฉันไม่ต้องการอาร์กิวเมนต์บรรทัดคำสั่ง แต่สามารถเพิ่มได้$0
หากจำเป็น
คุณสามารถลอง:
ps | grep `echo $$` | awk '{ print $4 }'
หรือ:
echo $SHELL
/pattern/ { action }
อะไรจะทำเมื่อใด
$SHELL
ตัวแปรสภาพแวดล้อมมีเชลล์ซึ่งกำหนดค่าเป็นค่าเริ่มต้นสำหรับผู้ใช้ปัจจุบัน มันไม่ได้สะท้อนถึงเชลล์ซึ่งทำงานอยู่ในขณะนี้ นอกจากนี้ยังใช้งานได้ps -p $$
ดีกว่าการ grepping $$ เนื่องจากมีผลบวกปลอม
awk
,ps | awk '$1=='$$' { n=split($4,a,"/"); print a[n] }'
$SHELL
ไม่จำเป็นต้องแสดงเชลล์ปัจจุบันเสมอไป มันสะท้อนให้เห็นถึงเปลือกเริ่มต้นที่จะเรียกเท่านั้น
ในการทดสอบข้างต้นกล่าวbash
คือเปลือกเริ่มต้นลองecho $SHELL
และจากนั้นในขั้วเดียวกันได้รับในบางเปลือกอื่น ๆ ( KornShell (ksh) ตัวอย่าง) $SHELL
และลอง คุณจะเห็นผลลัพธ์เป็น bash ในทั้งสองกรณี
cat /proc/$$/cmdline
ที่จะได้รับชื่อของเปลือกปัจจุบันใช้ readlink /proc/$$/exe
และเส้นทางที่จะปฏิบัติการโดยเปลือก
/proc
ให้คุณมี
ฉันมีเคล็ดลับง่าย ๆ เพื่อค้นหาเชลล์ปัจจุบัน เพียงพิมพ์สตริงแบบสุ่ม (ซึ่งไม่ใช่คำสั่ง) มันจะล้มเหลวและส่งคืนข้อผิดพลาด "ไม่พบ" แต่เมื่อเริ่มต้นบรรทัดมันจะพูดว่าเชลล์ตัวใดเป็น:
ksh: aaaaa: not found [No such file or directory]
bash: aaaaa: command not found
echo 'aaaa' > script; chmod +x script; ./script
ให้./script.sh: 1: aaaa: not found
ต่อไปนี้จะให้เชลล์จริงที่ใช้เสมอ - จะได้รับชื่อของไฟล์เรียกทำงานจริงและไม่ใช่ชื่อเชลล์ (เช่นksh93
แทนksh
ฯลฯ ) สำหรับก็จะแสดงเปลือกที่ใช้จริงคือ/bin/sh
dash
ls -l /proc/$$/exe | sed 's%.*/%%'
ฉันรู้ว่ามีหลายคนที่บอกว่าls
เอาต์พุตไม่ควรถูกประมวลผล แต่ความน่าจะเป็นที่คุณจะมีเชลล์ที่คุณใช้นั้นถูกตั้งชื่อด้วยอักขระพิเศษหรือวางไว้ในไดเรกทอรีที่มีอักขระพิเศษคืออะไร หากยังคงเป็นเช่นนั้นมีตัวอย่างอื่น ๆ อีกมากมายที่ทำให้แตกต่าง
ดังที่Toby Speightชี้ให้เห็นว่านี่จะเป็นวิธีที่เหมาะสมและสะอาดกว่าในการบรรลุเป้าหมายเดียวกัน:
basename $(readlink /proc/$$/exe)
/proc
ทั้งหมดที่ไม่ได้ให้ ไม่ใช่กล่องลินุกซ์ทั้งหมดของโลก
basename $(readlink /proc/$$/exe)
ที่จะls
+ +sed
echo
ash -> /bin/busybox
สิ่งนี้จะให้ / bin / busybox
ฉันได้ลองวิธีการต่าง ๆ มากมายและวิธีที่ดีที่สุดสำหรับฉันคือ:
ps -p $$
นอกจากนี้ยังทำงานภายใต้Cygwinและไม่สามารถสร้างผลบวกปลอมเป็น PID grepping ด้วยการทำความสะอาดบางอย่างมันจะแสดงผลเฉพาะชื่อที่ปฏิบัติการได้ (ภายใต้ Cygwin พร้อมพา ธ ):
ps -p $$ | tail -1 | awk '{print $NF}'
คุณสามารถสร้างฟังก์ชั่นเพื่อไม่ต้องจำ:
# Print currently active shell
shell () {
ps -p $$ | tail -1 | awk '{print $NF}'
}
... shell
และแล้วก็ดำเนินการ
มันได้รับการทดสอบภายใต้ Debian และ Cygwin
ps
, tail
และgawk
, cmd ไม่ได้กำหนด$$
เป็นมัน PID ดังนั้นแน่นอนไม่สามารถทำงานภายใต้คำสั่งธรรมดา
ps -p$$ -o comm=
? POSIX กล่าวว่าการระบุส่วนหัวที่ว่างทั้งหมดจะไม่แสดงส่วนหัวอย่างสมบูรณ์ เรายังคงล้มเหลว (เช่นps
คำตอบทั้งหมด) เมื่อเราได้รับสคริปต์ที่ดำเนินการโดยตรง (เช่น#!/bin/sh
)
ตัวแปรของฉันเกี่ยวกับการพิมพ์กระบวนการผู้ปกครอง:
ps -p $$ | awk '$1 == PP {print $4}' PP=$$
อย่าเรียกใช้แอปพลิเคชันที่ไม่จำเป็นเมื่อ AWK ทำเพื่อคุณ
awk
เมื่อไหร่ที่ps -p "$$" -o 'comm='
สามารถทำเพื่อคุณ?
มีหลายวิธีในการค้นหาเชลล์และเวอร์ชันที่สอดคล้องกัน ที่นี่มีน้อยที่เหมาะกับฉัน
ซื่อตรง
วิธีการแฮ็ก
$> ******* (พิมพ์ชุดอักขระสุ่มและในผลลัพธ์คุณจะได้รับชื่อเชลล์ในกรณีของฉัน-bash: ตอนที่ 2-a-sample-isomorphic-app: ไม่พบคำสั่ง )
โดยมีเงื่อนไขว่า/bin/sh
สนับสนุนมาตรฐาน POSIX และระบบของคุณมีlsof
คำสั่งติดตั้งซึ่งเป็นทางเลือกที่เป็นไปlsof
ได้ในกรณีนี้pid2path
คุณยังสามารถใช้ (หรือปรับ) สคริปต์ต่อไปนี้ที่พิมพ์เส้นทางแบบเต็ม:
#!/bin/sh
# cat /usr/local/bin/cursh
set -eu
pid="$$"
set -- sh bash zsh ksh ash dash csh tcsh pdksh mksh fish psh rc scsh bournesh wish Wish login
unset echo env sed ps lsof awk getconf
# getconf _POSIX_VERSION # reliable test for availability of POSIX system?
PATH="`PATH=/usr/bin:/bin:/usr/sbin:/sbin getconf PATH`"
[ $? -ne 0 ] && { echo "'getconf PATH' failed"; exit 1; }
export PATH
cmd="lsof"
env -i PATH="${PATH}" type "$cmd" 1>/dev/null 2>&1 || { echo "$cmd not found"; exit 1; }
awkstr="`echo "$@" | sed 's/\([^ ]\{1,\}\)/|\/\1/g; s/ /$/g' | sed 's/^|//; s/$/$/'`"
ppid="`env -i PATH="${PATH}" ps -p $pid -o ppid=`"
[ "${ppid}"X = ""X ] && { echo "no ppid found"; exit 1; }
lsofstr="`lsof -p $ppid`" ||
{ printf "%s\n" "lsof failed" "try: sudo lsof -p \`ps -p \$\$ -o ppid=\`"; exit 1; }
printf "%s\n" "${lsofstr}" |
LC_ALL=C awk -v var="${awkstr}" '$NF ~ var {print $NF}'
-i
(-> ละเว้นสภาพแวดล้อม) ไปenv
ยังบรรทัดที่คุณตรวจสอบlsof
ว่ามีอยู่ มันล้มเหลวด้วย: env -i PATH="${PATH}" type lsof
->env: ‘type’: No such file or directory
หากคุณเพียงต้องการตรวจสอบว่าคุณกำลังใช้งาน (รุ่นที่เฉพาะเจาะจง) Bash วิธีที่ดีที่สุดในการทำเช่นนั้นคือการใช้$BASH_VERSINFO
ตัวแปรอาร์เรย์ ในฐานะที่เป็นตัวแปรอาเรย์ (อ่านอย่างเดียว) จะไม่สามารถตั้งค่าในสภาพแวดล้อมดังนั้นคุณสามารถมั่นใจได้ว่ามันจะมา (ถ้าทั้งหมด) จากเปลือกปัจจุบัน
อย่างไรก็ตามตั้งแต่ทุบตีมีพฤติกรรมที่แตกต่างกันเมื่อเรียกว่าเป็นsh
คุณยังต้องตรวจสอบตัวแปรสภาพแวดล้อมที่มีปลาย$BASH
/bash
ในสคริปต์ฉันเขียนที่ใช้ชื่อฟังก์ชั่นด้วย-
(ไม่ขีดเส้นใต้) และขึ้นอยู่กับการเชื่อมโยงอาร์เรย์ (เพิ่มใน Bash 4) ฉันมีการตรวจสอบสติต่อไปนี้ (พร้อมข้อความแสดงข้อผิดพลาดของผู้ใช้ที่เป็นประโยชน์):
case `eval 'echo $BASH@${BASH_VERSINFO[0]}' 2>/dev/null` in
*/bash@[456789])
# Claims bash version 4+, check for func-names and associative arrays
if ! eval "declare -A _ARRAY && func-name() { :; }" 2>/dev/null; then
echo >&2 "bash $BASH_VERSION is not supported (not really bash?)"
exit 1
fi
;;
*/bash@[123])
echo >&2 "bash $BASH_VERSION is not supported (version 4+ required)"
exit 1
;;
*)
echo >&2 "This script requires BASH (version 4+) - not regular sh"
echo >&2 "Re-run as \"bash $CMD\" for proper operation"
exit 1
;;
esac
คุณสามารถละเว้นการตรวจสอบการทำงานของฟังก์ชั่นหวาดระแวงสำหรับคุณสมบัติในกรณีแรกและเพียงสมมติว่าเวอร์ชั่น Bash ในอนาคตจะเข้ากันได้
ไม่มีคำตอบใดที่ใช้งานได้กับfish
เชลล์ (ไม่มีตัวแปร$$
หรือ$0
)
งานนี้สำหรับฉัน (ทดสอบบนsh
, bash
, fish
, ksh
, csh
, true
, tcsh
และzsh
; openSUSE 13.2):
ps | tail -n 4 | sed -E '2,$d;s/.* (.*)/\1/'
bash
คำสั่งนี้ออกผลลัพธ์สตริงเหมือน ที่นี่ฉันใช้ps
แต่tail
และsed
(ไม่มีส่วนขยายของ GNU ให้ลองเพิ่ม--posix
เพื่อตรวจสอบ) มันเป็นคำสั่ง POSIX มาตรฐานทั้งหมด ฉันแน่ใจว่าtail
สามารถลบออกได้ แต่ฉันsed
ไม่แข็งแรงพอที่จะทำสิ่งนี้
ดูเหมือนว่าฉันว่าโซลูชันนี้ไม่สามารถพกพาได้มากเนื่องจากไม่สามารถทำงานบน OS X ได้ :(
sed: invalid option -- 'E'
ใช้ bash 3.2.51 และ tcsh 6.15.00
ทางออกของฉัน:
ps -o command | grep -v -e "\<ps\>" -e grep -e tail | tail -1
สิ่งนี้ควรพกพาข้ามแพลตฟอร์มและเชลล์ต่างๆ มันใช้ps
เหมือนโซลูชันอื่น ๆ แต่ไม่พึ่งพาsed
หรือawk
กรองขยะจากท่อและps
ตัวมันเองเพื่อให้เชลล์ควรเป็นรายการสุดท้าย วิธีนี้เราไม่จำเป็นต้องพึ่งพาตัวแปร PID ที่ไม่ได้พกพาหรือเลือกจากเส้นและคอลัมน์ที่เหมาะสม
ฉันได้ทดสอบกับ Debian และ macOS ด้วย Bash, Z shell ( zsh
) และfish (ซึ่งใช้ไม่ได้กับโซลูชันส่วนใหญ่โดยไม่เปลี่ยนนิพจน์สำหรับปลาโดยเฉพาะเพราะใช้ตัวแปร PID ที่แตกต่างกัน)
echo $$ # Gives the Parent Process ID
ps -ef | grep $$ | awk '{print $8}' # Use the PID to see what the process is.
grep $$
ไม่น่าเชื่อถือ ps -ef | awk -v pid=$$ '$2==pid { print $8 }'
จะดีกว่า แต่ทำไมไม่ใช้เพียงps -p $$
?
บน Mac OS X (และ FreeBSD):
ps -p $$ -axco command | sed -n '$p'
zsh
-bash
mutt
... : -b
ไม่จำเป็นต้องใส่ Greid PID จากเอาต์พุตของ "ps" เนื่องจากคุณสามารถอ่านบรรทัดคำสั่งที่เกี่ยวข้องสำหรับ PID ใด ๆ จากโครงสร้างไดเร็กทอรี / proc:
echo $(cat /proc/$$/cmdline)
อย่างไรก็ตามนั่นอาจจะไม่ดีไปกว่าเพียงแค่:
echo $0
เกี่ยวกับการใช้งานเชลล์ที่แตกต่างจากชื่อจริง ๆ แนวคิดหนึ่งคือขอรุ่นจากเชลล์โดยใช้ชื่อที่คุณได้รับก่อนหน้านี้:
<some_shell> --version
sh
ดูเหมือนจะล้มเหลวด้วยรหัสออก 2 ในขณะที่คนอื่นให้สิ่งที่มีประโยชน์ (แต่ฉันไม่สามารถยืนยันได้ทั้งหมดเนื่องจากฉันไม่มี)
$ sh --version
sh: 0: Illegal option --
echo $?
2
นี่ไม่ใช่วิธีที่สะอาดมาก แต่ทำในสิ่งที่คุณต้องการ
# MUST BE SOURCED..
getshell() {
local shell="`ps -p $$ | tail -1 | awk '{print $4}'`"
shells_array=(
# It is important that the shells are listed in descending order of their name length.
pdksh
bash dash mksh
zsh ksh
sh
)
local suited=false
for i in ${shells_array[*]}; do
if ! [ -z `printf $shell | grep $i` ] && ! $suited; then
shell=$i
suited=true
fi
done
echo $shell
}
getshell
$(getshell) --version
ตอนนี้คุณสามารถใช้
แม้ว่าจะใช้ได้กับเชลล์ KornShell (ksh) เท่านั้น
dash
, yash
ฯลฯ โดยปกติถ้าคุณกำลังใช้bash
, zsh
, ksh
สิ่งที่ - คุณไม่ควรดูแลเกี่ยวกับสิ่งต่างๆ
ksh
ชุดของคุณสมบัติส่วนใหญ่เป็นส่วนย่อยของbash
คุณสมบัติ (ยังไม่ได้ตรวจสอบอย่างละเอียด)
ทำสิ่งต่อไปนี้เพื่อทราบว่าเชลล์ของคุณใช้ Dash / Bash หรือไม่
ls –la /bin/sh
:
ถ้าผลลัพธ์คือ/bin/sh -> /bin/bash
==> จากนั้นเชลล์ของคุณกำลังใช้ Bash
ถ้าผลลัพธ์คือ/bin/sh ->/bin/dash
==> จากนั้นเชลล์ของคุณใช้ Dash
หากคุณต้องการเปลี่ยนจาก Bash เป็น Dash หรือกลับกันใช้รหัสด้านล่าง:
ln -s /bin/bash /bin/sh
(เปลี่ยนเชลล์เป็น Bash)
หมายเหตุ : หากคำสั่งดังกล่าวส่งผลให้เกิดข้อผิดพลาดว่า / bin / sh มีอยู่แล้วให้ลบ / bin / sh แล้วลองอีกครั้ง
และฉันมากับสิ่งนี้
sed 's/.*SHELL=//; s/[[:upper:]].*//' /proc/$$/environ
กรุณาใช้คำสั่งด้านล่าง:
ps -p $$ | tail -1 | awk '{print $4}'
echo $SHELL
ทำในสิ่งที่คุณพยายามจะทำและทำมันให้ดี อันที่สองยังไม่ดีเนื่องจาก$SHELL
ตัวแปรสภาพแวดล้อมมีเชลล์เริ่มต้นสำหรับผู้ใช้ปัจจุบันไม่ใช่เชลล์ที่กำลังทำงาน ถ้าผมมีตัวอย่างเช่นbash
ชุดเปลือกเริ่มต้นดำเนินการzsh
และมันจะพิมพ์echo $SHELL
bash
echo $SHELL
อาจเป็นขยะ: ~ $ echo $SHELL /bin/zsh ~ $ bash bash-4.3$ echo $SHELL /bin/zsh bash-4.3$
สิ่งนี้ใช้ได้ดีกับRed Hat Linux (RHEL), macOS, BSD และAIXบางตัว :
ps -T $$ | awk 'NR==2{print $NF}'
หรือมิฉะนั้นรายการต่อไปนี้ควรใช้ได้ถ้าpstreeพร้อมใช้งาน
pstree | egrep $$ | awk 'NR==2{print $NF}'
!
ทดแทนหรือไม่) น่าจะพกพาได้มากกว่าการค้นหาชื่อของเชลล์ ประเพณีท้องถิ่นอาจจะมีบางสิ่งบางอย่างที่คุณเรียกใช้ชื่อ/bin/sh
ซึ่งอันที่จริงอาจเป็นเถ้าประทุบตี ฯลฯ