Я использую xmodmap, и он хорошо работает. Установите xmodmap и имейте xmodmap .xmod
автоматический запуск. Содержание .xmod.
remove Lock = Caps_Lock
keycode 66 = Control_L NoSymbol Control_L
add Control = Control_L
Возможно, Ваш код клавиши отличается.
На Linux можно использовать /proc/PID/exe
.
Пример:
# readlink /proc/$$/exe
/bin/zsh
Возможно, не, что Вы просите, но это должно работать в некоторой степени, чтобы определить, что интерпретатору, в настоящее время интерпретирующему его для некоторых, нравится
osh
),bash
),ksh88
, ksh93
, pdksh
, mksh
),zsh
,posh
),yash
),rc
оболочка,akanga
оболочка,wish
Интерпретатор TCL,tclsh
Интерпретатор TCL,expect
Интерпретатор TCL,cmd.exe
, command.com
(MS-DOS, FreeDOS...). 'echo' +"'[{<?php echo chr(13)?>php <?php echo PHP_VERSION.chr(10);exit;?>}\
@GOTO DOS [exit[set 1 [[set 2 package] names];set 3 Tcl\ [info patchlevel];\
if {[lsearch -exact $1 Expect]>=0} {puts expect\ [$2 require Expect]\ ($3)} \
elseif {[lsearch -exact $1 Tk]>=0} {puts wish\ ($3,\ Tk\ [$2 require Tk])} \
else {puts $3}]]]' >/dev/null ' {\">/dev/null \
">"/dev/null" +"\'";q="#{",1//2,"}";a=+1;q='''=.q,';q=%{\"
'echo' /*>/dev/null
echo ">/dev/null;status=0;@ {status=1};*=(" '$' ");~ $status 1&&{e='"\
"';eval catch $2 ^'&version {eval ''echo <='^ $2 ^'&version''}';exit};e='"\
"';if (eval '{let ''a^~a''} >[2] /dev/null'){e='"\
"';exec echo akanga};eval exec echo rc $2 ^ version;\" > /dev/null
: #;echo possibly pre-Bourne UNIX V1-6 shell;exit
if (! $?version) set version=csh;exec echo $version
:DOS
@CLS
@IF NOT "%DOSEMU_VERSION%"=="" ECHO DOSEMU %DOSEMU_VERSION%
@ECHO %OS% %COMSPEC%
@VER
@GOTO FIN
", unless eval 'printf "perl %vd\n",$^V;exit;'> "/dev/null";eval ': "\'';
=S"';f=false e=exec\ echo n=/dev/null v=SH_VERSION;`(eval "f() { echo :
};f")2>$n` $f||$e Bourne-like shell without function
case `(: ${_z_?1}) 2>&1` in 1) $e ash/BSD sh;;esac;t(){
eval "\${$1$v+:} $f &&exec echo ${2}sh \$$1$v";};t BA ba;t Z z;t PO po;t YA ya
case `(typeset -Z2 b=0;$e $b)2>$n` in 00) (eval ':${.}')2>$n&&eval '
$e ksh93 ${.sh.version}';t K pdk;$e ksh88;;esac;case `(eval '$e ${f#*s}$($e 1
)$((1+1))')2>$n` in e12)$e POSIX shell;;esac;$e Bourne-like shell;: }
print "ruby ",RUBY_VERSION,"\n";exit;' ''';import sys
print("python "+sys.version);z='''*/;
s="";j="JavaScript";if(typeof process=="object"){p=console.log;p(process.title
,process.version)}else{p=print;p((f="function")==(t=typeof version)?"string"==
typeof(v=version())?v:(typeof build!=f?"":s= "SpiderMonkey ")+j+" "+v:(t==
"undefined"?j+"?":version)+"\n");if(s)build()}/*
:FIN } *///'''
Я отправил начальную версию того which_interpreter сценария приблизительно 2004 в Usenet. Sven Mascheck имеет (вероятно, более полезный для Вас) сценарий, названный whatshell, который фокусируется на идентификации подобных Границе оболочек. Можно также найти объединенную версию наших двух сценариев там.
print
быть функцией.
– Chris Down
04.04.2013, 12:19
bash 3.2.53(1)-release
как интерпретатор, интерпретирующий его.
– Stéphane Chazelas
10.08.2015, 11:53
Вы могли попробовать
ps -o args= -p "$$"
который даст Вам название команды, связанной с pid сценария.
cmd
кому: comm
когда POSIXifying ответ.
– Stéphane Chazelas
04.04.2013, 14:04
Это - то, что я использую в своем .profile для проверки на различные оболочки в системах, я продолжаю работать. Это не делает тонкие различия между ksh88 и ksh93, но это никогда не приводило меня к сбою.
Обратите внимание, что это не требует единственного ветвления или канала.
# Determine what (Bourne compatible) shell we are running under. Put the result
# in $PROFILE_SHELL (not $SHELL) so further code can depend on the shell type.
if test -n "$ZSH_VERSION"; then
PROFILE_SHELL=zsh
elif test -n "$BASH_VERSION"; then
PROFILE_SHELL=bash
elif test -n "$KSH_VERSION"; then
PROFILE_SHELL=ksh
elif test -n "$FCEDIT"; then
PROFILE_SHELL=ksh
elif test -n "$PS3"; then
PROFILE_SHELL=unknown
else
PROFILE_SHELL=sh
fi
ksh93
иметь $KSH_VERSION
. Та переменная прибывает из pdksh
и никогда AT&T ksh88, до которого добираются.
– Stéphane Chazelas
16.04.2013, 00:28
posh
(pdksh с большинством функций неPOSIX, удаленных, таким образом, Вы, вероятно, хотели бы назвать это "sh"), не имеет никакого FCEDIT, ни KSH_VERSION, но имеет PS3 (возможно, не долгое время), хотя это маловероятно для одного иметь его как оболочку входа в систему. Также обратите внимание, что код выше не отразился бы ли bash
или zsh
находятся в sh
режим эмуляции, который может быть проблемой, если Вы используете $PROFILE_SHELL
решить, разрешить ли это или ту функцию. См. также whatshell Sven Mascheck для больше, Вы можете (или не может) хотеть проверить.
– Stéphane Chazelas
16.04.2013, 09:25
Если существует lsof
команда, доступная в Вашей системе, можно получить полный путь родительского исполняемого файла оболочки путем получения родительского PID через ps
и парсинг ouput lsof -p $ppid
(см., Как определить текущую оболочку, я продолжаю работать?).
#!/bin/sh
ppid="`ps -p "$$" -o ppid=`"
lsof -nP -p "$ppid" | awk 'NR==3 {print $NF; exit}'
/
, если я использую NR==4
Я получаю путь к родителю оболочек.
– Thor
15.04.2013, 10:10
sh
s имеют $PPID
переменная. На Linux
, можно использовать readlink -f "/proc/$PPID/exe"
.
– Stéphane Chazelas
09.09.2014, 15:48
За пределами земли Linux или недостающий доступ к/proc файловой системе или equivelent, можно использовать pstree:
Принятие Вас имеет pid
На Mac:
./test.sh
16012
-+= 00001 root /sbin/launchd
\-+= 00245 wingwong /sbin/launchd
\-+= 04670 wingwong /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_2052597
\-+= 11816 root login -pf wingwong
\-+= 11817 wingwong -bash
\-+= 16012 wingwong ksh ./test.sh
\-+- 16013 wingwong pstree -p 16012
На поле Linux:
./test.sh
14981
bash(14981)---pstree(14982)
Формат и стиль вывода от pstree отличаются, в зависимости от Вашей среды, но можно осуществить вывод ASCII, и затем sed/tr/awk/etc. фильтруют вывод для получения оболочки, которая запускает скрипт.
Так очищенная версия вывода (работает на Mac или Linux выполнения ОС):
#!/usr/bin/env sh
pstree -p $$ | tr ' ()' '\012\012\012' | grep -i "sh$" | grep -v "$0" | tail -1
На выполненных урожаях:
./test.sh
sh
И, когда выполнено с другой оболочкой:
#!/usr/bin/env ksh
pstree -p $$ | tr ' ()' '\012\012\012' | grep -i "sh$" | grep -v "$0" | tail -1
Урожаи:
./test.sh
ksh
Никакая корневая или специальная файловая система не требуется. Отметьте, моя фильтрация предполагает, что двоичный файл оболочки называет концы с sh и что нет никаких промежуточных записей, которые заканчиваются sh. Также предполагает, что Вы не назвали свой сценарий "sh" или некоторый неудачный grep шаблон, который сотрет информацию.:) Потребует, чтобы некоторая настройка для Вашей собственной среды гарантировала более высокую степень защиты от неумелого обращения.
Можно использовать команду:
$ echo $SHELL
узнать оболочку из сценария.
$SHELL
оболочка выбора пользователя. Инициализированный от оболочки входа в систему пользователя. Ничто, чтобы сделать с в настоящее время рабочей оболочкой.
– Stéphane Chazelas
04.04.2013, 09:55
Портативное решение (, протестированное в Linux и macOS):
ps -o args= -p $$ | egrep -m 1 -o '\w{0,5}sh'
где:
"ps -o args=" retrieves the command line arguments
"$$" gives you the current PID
"-m 1" to finish searching after the first match
"-o" to only display matching portion
"\w{0,5}sh" regular expression to find things like bash in /bin/bash or ksh in -ksh or sh in sh (Maximum 5 characters+sh)
надеюсь, это поможет
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
дает zsh или ksh вместо этого. (Это составило бы 0$, если бы оболочки волшебно не зафиксировали это для предоставления названия сценариев вместо этого). – frostschutz 13.04.2013, 02:17/proc
является столь ужасным и непортативным, как это добирается. – Jens 15.04.2013, 15:58/proc
не 'ужасно'./proc
часто очень изящное решение. Непортативный да, но потому что что-то непортативно, не делает это ужасным. – Patrick 16.04.2013, 15:17/proc
ужасный, потому что файлы в нем могут прийти и уйти в прихоти разработчиков и содержании файлов, является склонным для изменения без уведомления, причиняя бесконечную боль из-за bitrot и перемещая форматы конечного файла. – Jens 18.04.2013, 14:12