Посмотрите, работает ли скрипт при использовании #! / Usr / bin / env

Я попробовал мигрировать shebang для своих сценариев bash из #!/bin/bash в #!/usr/bin/env bash , а некоторые из них были сломаны, потому что они полагались на этот код, который проверяет наличие существующих экземпляров самих runnning и который работает только с #!/bin/bash :

 $ pidof -x myscript -o %PPID 

Я хотел бы знать, как я могу надежно проверить, запущен ли скрипт, вызванный env , поскольку большинство решений, которые я пробовал, будут связаны с некоторым грязным регулярным выражением, и все еще остаются ненадежными:

 $ pgrep -f '(^|/)myscript(\s|$)' 

Учитывая путь к моему сценарию: /home/user/myscript , приведенный выше код может вернуть PID для следующих нежелательных команд:

 editor /home/user/myscript bash /tmp/myscript bash /home/user/myscript with spaces 

One Solution collect form web for “Посмотрите, работает ли скрипт при использовании #! / Usr / bin / env”

В Linux вы можете использовать pgrep для получения PID вероятных подозреваемых и проверить первый аргумент этих PID (доступных в /proc/$PID/cmdline ). /proc/$PID/cmdline имеет все аргументы (включая аргумент 0) процесса, разделенные ASCII NUL ( \0 ).

Что-то вроде:

 pgrep bash | xargs -I {} sed -nz '2{p; q}' /proc/{}/cmdline | grep -Fqzx "$0" 

Это предполагает, что ваши sed и grep поддерживают нулевые строки. Команда sed печатает вторую строку соответствующих файлов cmdline (аргумент 1), которая будет именем сценария. Затем grep ищет точные совпадения имени вашего скрипта. Вы можете сделать весь матч в sed , но я не чувствую себя жонглированием цитатами.

Это не удастся, если вы вызовете свой сценарий по разным путям:

 /home/user/myscript cd /home; usr/myscript myscript 

Тем не менее, это должно быть безопасно против пробелов в именах сценариев.

  • установить флаг для удаления дубликатов записей из файла на основе некоторых значений записи
  • Загрузите другой .bashrc при запуске консоли или термина из командной строки
  • Логический И в сценарии bash
  • dash: строка синтаксического анализа на две переменные
  • Как узнать идентификатор процесса родительского процесса?
  • Использование $ в пароле
  • Получение ошибки со сном и аргументом в sh-скрипте
  • Поиск каталога рекурсивно для файлов, перечисленных в csv, и скопировать их в другое место
  • Неожиданная ошибка EOF и синтаксиса
  • Как использовать sed для замены ключей в файле с помощью регулярного выражения?
  • как отправить сигнал клавиатуры с помощью сценария оболочки
  • Interesting Posts

    Прокси-сервер с широким спектром услуг с запросом сервера ISA

    Как я могу получить первый матч от расширения подстановочных знаков?

    Почему Linux очищает кеш памяти, когда он почти заполнен?

    Как преобразовать файлы изображений в формат .edj из командной строки?

    Открытие нескольких вкладок в gnome-терминале, с их автоматическим паролем без ssh на серверы и сделать это с помощью псевдонима из моего файла bashrc

    Как заставить десятичное сложение (# 10) при добавлении чисел с переносом (восьмеричная проблема)

    Аудио перестало работать в Xine в Debian

    Команда сортировки не работает должным образом

    Нельзя подписывать / шифровать, если я не запускаю gpg-agent вручную

    Удалить строку ровно n символов

    df и жесткие ссылки для резервного копирования

    С несколькими процессами может ли один процесс (p1) отправлять сигнал синхронизации SIGALRM, который принимается двумя или более процессами (p1, p2).?

    Получить пароль для входа в opensuse 13.2?

    chcon: не может применять частичный контекст к немеченому файлу при установке nagios с SELinux

    Как активировать swap после добавления дополнительной памяти?

    Linux и Unix - лучшая ОС в мире.