В сети много видел вопросов из серии как узнать какой shell сейчас запущен, но так и не нашол ответа, обычно пургу отвечают. :) Универсального ответа так и не нашол...Вопрос: как в шелле узнать какой шелл???
Ответ1
echo $SHELL не катит т.к. он показывает переменную окружения, а не шелл в котором я счас. Например после логина запуская у меня на сервере разные шелы и сомтря занчение переменной - видим одно и тоже... шелл который по умолчанию для меня.Ответ2
echo $0 тоже не катит, так как он показывает не шел в котором я а "оболочку" притом без пути. Попробуйте залогиниться под юзером набрать это, а потом набрать этоже после команды su :) оно и выдаст -su а не текущий шелл.Так что, кто-то знает как заставить шелл признаться - какой у него исполняемый файл(полный путь и имя файла) и неплохо бы ешо его и версию
>[оверквотинг удален]
>
>Ответ2
>echo $0 тоже не катит, так как он показывает не шел в
>котором я а "оболочку" притом без пути. Попробуйте залогиниться под юзером
>набрать это, а потом набрать этоже после команды su :) оно
>и выдаст -su а не текущий шелл.
>
>Так что, кто-то знает как заставить шелл признаться - какой у него
>исполняемый файл(полный путь и имя файла) и неплохо бы ешо его
>и версиюсморти /etc/passwd на юзера, а для версии сотри ман на предмет флага -v or --version
>
>сморти /etc/passwd на юзера, а для версии сотри ман на предмет флагаи чем это отличаеться от просмотра переменной ШЕЛЛ??? (с идейной точки зрения, понятно шо в переменную можно чипуху записать, но мы это не расматриваем)
я про то что, кто сказал что пользователь потом не перезапускал шелл, уже юзая какойто другой,я ж писал шо вариант сразу накрываеться попой, если запустить из своего шела другой шелл>-v or --version
нету, да и вопрос есть ли в шеле команда, шоб узнать... типа как uname -v только про шелл
PID шела - echo $$
>PID шела - echo $$РЕСПЕКТ!!! вот то шо надо вкратце и по существу....
то шо надо, всмысле по теме, но немного не то...вот я сделал
логинюсь
запускаю sh
потом bash
потом su
ввожу echo $$
и что ты думаешь оно сообщило ? _su(csh) это его ответ... это
получаеться если скрипту нужно узнать какой шелл, то бегать по выводу команды ps -Al
и думать , шоб найти какойже шелл работает.ЗЫ:
в базовые скрипты отправляющая станция вставляет вставки, которым во время работы нужно узнать какой шелл нынче, а в каком шелле будет выходной скрипт выполняться определиться лишь на принимающей станции... типа авто-админа пытаемся сделать.... который будет слать скрипты станциям шоб те их выполнили, притом исходя из того шо легче сделать нужные действия далеко не в стандартном шеле, а есть там нестандартный или нету, и какой есть, опеределиться только на конечной станции
#!/usr/local/bin/bashq=`basename $0`
w=`head -n 1 ${q} | sed 's/.*\///'`echo "${w}"
Вас это интересовало?
>#!/usr/local/bin/bash
>
>q=`basename $0`
>w=`head -n 1 ${q} | sed 's/.*\///'`
>
>echo "${w}"
>
>
>Вас это интересовало?так это же тоже самое что и echo $0 - если это выполнить после команды su ... оно вместо шелла выдаёт саму su. вот после sudo всёравно выдаёт шелл притом с полным путём - и тогда ваш скрипт полность оправдывает надежды. а вот после su нет
да и после логина набор этих команд не даст эфекта... так как в переменной 0 записано не "sh" a "-sh" basename вообще тогда материться.
мне бы именно универсальный метод, пусть и через попу, если у шела нет встроеных команд-позывных :) но который сработает в любом случае....
>ввожу echo $$
>и что ты думаешь оно сообщило ? _su(csh) это его ответ... это
>
>получаеться если скрипту нужно узнать какой шелл, то бегать по выводу команды
>ps -Al
>и думать , шоб найти какойже шелл работает.а у меня echo $$ всегда выдаёт PID текущего шелла (пробовал bash, sh, dash) - даже после su... Это у вас csh или su видимо глючит.
Вообще, у скриптов в первой строке написано чем их запускать, так что узнавать это ещё и внутри скрипта обычно не нужно.
>[оверквотинг удален]
>>получаеться если скрипту нужно узнать какой шелл, то бегать по выводу команды
>>ps -Al
>>и думать , шоб найти какойже шелл работает.
>
>а у меня echo $$ всегда выдаёт PID текущего шелла (пробовал bash,
>sh, dash) - даже после su... Это у вас csh или
>su видимо глючит.
>
>Вообще, у скриптов в первой строке написано чем их запускать, так что
>узнавать это ещё и внутри скрипта обычно не нужно.Это обычно,а у нас будет запускаться код, и какой интерпритатор есть возможность узнать только после запуска. и хотелось бы иметь возможность не выполнять, то что в данном интерпритаторе не будет работать.
>[оверквотинг удален]
>
>Ответ2
>echo $0 тоже не катит, так как он показывает не шел в
>котором я а "оболочку" притом без пути. Попробуйте залогиниться под юзером
>набрать это, а потом набрать этоже после команды su :) оно
>и выдаст -su а не текущий шелл.
>
>Так что, кто-то знает как заставить шелл признаться - какой у него
>исполняемый файл(полный путь и имя файла) и неплохо бы ешо его
>и версиюhead -n 1 /proc/`echo $$`/status
>head -n 1 /proc/`echo $$`/statusдо первого слеша я так понимаю = вывести шабку файла в количестве одна строка а потом имя файла должно ити или текст.... вот то что там ему не нравиться... пишет
/proc/<PID>/status нет такого файла
озвучьте ТЗ полностью
>>
>>>head -n 1 /proc/`echo $$`/statusэто для линуксов
>В сети много видел вопросов из серии как узнать какой shell сейчас
>запущен, но так и не нашол ответа, обычно пургу отвечают. :)
>Универсального ответа так и не нашол...
>
>Вопрос: как в шелле узнать какой шелл???ps auxw | grep `echo $$` | grep -v grep |awk '{print $11;}'
>ps auxw | grep `echo $$` | grep -v grep |awk '{print
>$11;}'ps |awk '$1=="'$$'"{print $4;exit}'
спасибо за ответы, но я так понял что мы пошли по пути получения чистого имени шела из вывода ps зная ПИД шела по переменной $$. Всё это понятно, яб и сам сделал, еслиб небыло ситуаций когда $$ хранит не пид шела а например команды su У меня кстате FreeBSDя так понимаю в интерпритаторах нет встроенной команды для вывода информации про сам интерпритатор. :(
>я так понимаю в интерпритаторах нет встроенной команды для вывода информации про
>сам интерпритатор. :("Переносимого" (для любого ос-а и любого sh), видимо, нет. "Их" просто много, и "минимальное" подмножество (оно же - переносимый шелл, юних шелл, посикс шелл) очень куцее.
Соответственно, либо пишешь "переносимо" и отплясываешь вокруг всех ограничений всех возможных шеллов, либо, если есть возможность, выбираешь 1 из возможных шелов и пишешь на нём, "несовместимо".
Не совсем так. Ее нет у sh, который условно можно считать всегда имеющимся в наличии минимумом. В других шеллах такие средства есть, но различаются и на этом отличии и можно сыграть, например для баша будет непустой $BASH, для tcsh скорее всего $SHLVL итд. Поищите уникальные особенности в манах по нужным вам шеллам.
А можно узнать для чего вообще такой изврат нужен? Ведь даже если вы пытаетесь выполнить команды через ssh на машине с неизвестным шеллом, то можно либо ограничится sh, либо передать файл с нужным скриптом через scp. Для последнегоо скорее важно наличие(/etc/shells) нужных шеллов(а еще лучше перла), а не выяснение текущего шелла.