Как узнать, какой SHELL используется при запуске скрипта?

Попробуйте это,

Время 2017-03-25 05:52:09.373941000можно преобразовать в первый формат 24MAR17:00:14:09и затем выполнить сравнение.

date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" |  tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
2
13.03.2019, 20:24
2 ответа

Поскольку вы указали Linux, это можно сделать с помощью readlink -f /proc/$$/exe. Это даст вам (на стандартном выходе )путь к оболочке, выполняющей ваш сценарий оболочки (что-то вроде/bin/bash). Таким образом, вы можете назначить его переменной (по крайней мере в оболочке POSIX )с помощью var=$(readlink -f /proc/$$/exe).

$$— pid текущей оболочки; /proc/«pid»/exe— это функция ядра, которая позволяет вам запрашивать исполняемый файл, запущенный с заданным pid, в форме несколько «волшебной» символической ссылки. Таким образом, вы можете использовать readlink, чтобы получить путь.

В системах, отличных от -Linux, вы должны иметь возможность использовать ps, например, ps -o args= $$, но это может привести к тому, что вместо этого вы получите имя сценария (POSIX допускает любое поведение ).

За исключением случаев, когда ваш сценарий предназначен для использования, например, для установки переменных в пользовательской оболочке, вам действительно следует использовать строку #!вверху вместо того, чтобы указать, в какой оболочке его запускать.

1
27.01.2020, 22:27

Отдельный сценарий не должен проверять, в каком интерпретаторе он работает. Такой вид самоанализа неудобен и подвержен ошибкам, и, возможно, его придется реализовывать по-разному для разных Unices.

Например, сценарий Perl всегда можно с уверенностью предположить, что он интерпретируется интерпретатором Perl, сценарий Python всегда выполняется интерпретатором Python и так далее. Так почему бы сценарию bashне предполагать, что он запускается bash, а сценарию sh— что он запускается /bin/sh?

Тестирование конкретных возможностей текущего интерпретатора — это отдельная проблема, и, например. bashпредлагает $BASH_VERSIONи массив $BASH_VERSINFOдля проверки версии против (, например ).

Итак, как вы можете сделать, например,. сценарий bashзапускается с помощью bash, а сценарий cshзапускается с помощью csh? Ну, вы не позволяете пользователю выбирать переводчика.

Вы можете сделать это,

  • Отсутствие суффикса имени файла в файле скрипта,на случай, если это "запутает" пользователя. Сценарий bashв файле myscript.shможет заставить пользователя думать, что его можно запустить с помощью sh. Вместо этого просто вызовите скрипт myscriptи...

  • Используйте строку#!("shebang" или "hashbang" ).

Строка#!-идет в самой первой строке скрипта (, два символа #!должны быть первыми в файле )и указывают путь к используемому интерпретатору.

Сценарий bashможет иметь

#!/bin/bash

, если это путь к исполняемому файлу bashв вашей системе, или если вы хотите, чтобы bashзагружался из любого места в $PATH, где он находится в вашей системе,

#!/usr/bin/env bash

в качестве первой строки, например.

Это гарантирует, что он всегда будет интерпретироваться bash, а не sh, csh, pythonили каким-либо другим интерпретатором несвязанного языка.

Следующим шагом будет

  • Сделайте скрипт исполняемым, используя chmod +x myscript.

Теперь вы можете запустить свой скрипт с помощью

./myscript

не беспокоясь о том, какой интерпретатор использовать для его выполнения. На самом деле, для пользователя сценария совершенно не имеет значения , был ли это сценарий bash, сценарий Python или скомпилированный двоичный файл.

0
27.01.2020, 22:27

Теги

Похожие вопросы