Соедините независимые хижины каналом

Оболочка действительно ли пользователя по умолчанию отличается, чем другие? (также в /etc/passwd) Это могло быть потенциальной причиной.

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

Если оболочка по умолчанию прекрасна (соответствие другим пользователям) затем пытаются определить если .bashrc или .bash_profile отличается, чем, что находится в домашней папке других пользователей? (Мог также быть ~/.profile, ~/.zprofile или ~/.login в зависимости от того, что Вы используете...),

20
28.04.2014, 04:57
4 ответа
[116737] Вы не можете решить это напрямую через shebang, так как shebang - чисто статический. Что вы можете сделать, так это иметь какой-нибудь "наименьший общий множитель" (с точки зрения оболочки) в shebang и перезапустить ваш скрипт с правильной оболочкой, если этот LCM не zsh. Другими словами: Пусть ваш скрипт, выполненный оболочкой, найден во всех системах, проверьте на наличие только функции [117204]zsh[117205]- и если тест окажется ложным, запустите скрипт [117206]exec[117207] с [117208]zsh[117209], где тест будет успешным, и вы просто продолжите его.

Уникальной особенностью в [117210]zsh[117211], например, является наличие переменной [117212]$ZSH_VERSION[117213]:

В этом простом случае скрипт сначала выполняется с помощью [117214]/bin/sh[117215] (все Unix-подобные системы пост80-х годов понимают [117216]#! [117217] и имеют [117218]/bin/sh[117219] , либо Bourne, либо POSIX, но наш синтаксис совместим с обоими). Если [117220]$ZSH_VERSION[117221] установлен [117222], а не [117223], то скрипт [117224]exec[117225] сам по себе через [117226]zsh[117227]. Если установлено [117228]$ZSH_VERSION[117229] (или скрипт уже запущен через [117230]zsh[117231]), то тест просто пропускается. Voilà.

Это не работает, только если [117232]zsh[117233] вообще не находится в [117234]$PATH[117235].

  1. Правка: [117237] Чтобы убедиться, что вы только [117238]exec[117239] и [117240]zsh[117241] в обычных местах, вы можете использовать что-то вроде

  2. Это может спасти вас от случайного [117242]exec[117243] использования чего-то в вашем [117244]$PATH[117245], что не является [117246]zsh[117247], которого вы ожидаете.[116748].

22
27.01.2020, 19:44
[116781] В течение многих лет я использовал нечто похожее для работы с различными местами Bash на системах, для запуска которых мне нужны были мои скрипты.

INSERT INTO MyTable (ISAM_ID, ENTITY, CUSTOMER_MEDIA,STATUS,IIN,OID,FVC)
   VALUES ( 10001, 'ErferrRR01','MP3','LOADED'
   ,'RRGEE', '232133122dfcsdds212121','TGEE');
Bash/Zsh/etc.

enter image description here

Вышеизложенное можно легко адаптировать для различных интерпретаторов. Ключевым моментом является то, что этот скрипт изначально работает как Bourne shell. Затем он рекурсивно вызывает себя второй раз, но разбирает всё, что находится над комментарием [117288]### BEGIN[117289], используя [117290]sed[117291].

Perl

Вот похожий трюк для Perl:

Этот метод использует способность Perl, когда даётся запускаемый файл будет разбирать указанный файл, пропуская все строки, которые находятся перед строкой [117292]#! perl[117293].[116792].

7
27.01.2020, 19:44
[116914] ПРИМЕЧАНИЕ: @jw013 делает следующее возражение [117414] неподдерживаемым[117415] в комментариях ниже:
  • Снижающаяся цитата объясняется тем, что обычно считается, что самоизменяющийся код плохая практика. В старые добрые времена крошечных сборочных программ это была умный способ уменьшить условные ветви и улучшить производительность, но в настоящее время риски безопасности перевешивают преимущества. Ваш подход не сработает, если пользователь, запустивший скрипт, не напишет. Я ответил на его возражения по безопасности, указав, что [117418] любые [117419] специальные разрешения требуются [117420] только один раз [117421] на действие [117422] по установке/обновлению [117423] для того, чтобы [117424] установить/обновить [117425] сценарий [117426] самоустановки [117427] - что я лично назвал бы довольно безопасным. Я также указал ему на ссылку
  • человека sh
  • на достижение аналогичных целей с помощью аналогичных средств. В то время я не удосужился указать на то, что какие бы недостатки безопасности или иные [117430] в целом непроверенные методы [117431], которые могут быть или не быть представлены в моем ответе, они, скорее всего, коренятся в самом вопросе, чем в моем ответе на него:

    Как я могу настроить шум так, чтобы запуск сценария в качестве /path/to/script.sh всегда использует Zsh, доступный в PATH?

    Не удовлетворен, @jw013 продолжил возражать, выдвинув свой аргумент [117434]пока еще неподдерживаемый[117435], по крайней мере, с парой ошибочных утверждений:

    Вы используете один файл, а не два. На [117686][[117748]man sh[117749] ссылался][117687]. в пакете есть один файл, который изменяет другой файл. У вас есть файл, изменяющий сам по себе. Есть явная разница между этими двумя случаями. Файл который принимает входной сигнал и производит выходной, это нормально. Исполняемый файл, который меняется сама по себе, так как работает - это, как правило, плохая идея. Пример, который вы Указанное не делает этого.

    В первую очередь:[12123]ТОЛЬКО [117438]ИСПОЛНИТЕЛЬНЫЙ [117439] КОД В ЛЮБОМ [117440]ИСПОЛНИТЕЛЬНОМ [117441] КРИСТЕ - это [117442]#![117443] ИТСЭЛЬФ[12124] (хотя даже [117688]#! [117689] является [117690] официально неуказанным[117691])[12125] Сценарий оболочки - это просто текстовый файл - для того, чтобы он имел какое-либо действие, он должен быть [117446] прочитан[117447] другим исполняемым файлом, его инструкции затем [117448] интерпретированы[117449] этим другим исполняемым файлом, прежде чем, наконец, другой исполняемый файл, затем [117450] выполнит свою интерпретацию [117451] сценария оболочки. Невозможно [12126][12127], чтобы файл сценария оболочки [12128] включал менее двух файлов.[12129] В собственном компиляторе [117456]zsh[117457] есть возможное исключение, но с этим у меня мало опыта и он ни в коем случае не представлен здесь.[12130] Хэшбэнг сценария оболочки [117458] должен указывать на интерпретатор [117460] или отбрасываться как несущественный. [12131]Хэшбэнг скрипта SHELL [117462]TOKEN RECOGNITION/EXECUTION[117463] BEHAVIOR IS STANDARDS-DEFINED[12132]Оболочка имеет два основных режима парсинга и интерпретации своего входа: либо текущий ввод определяет [117464]<[117511] - а должна хранить определение как единственную, буквальную строку и выполнять его как специальную оболочку, встроенную при вызове. [12139]Таким образом, функция оболочки, объявленная в исполняемом скрипте оболочки, хранится в памяти интерпретирующей оболочки в ее литературно-строковом виде - необязательно для включения в качестве входных прилагаемых здесь документов - и выполняется независимо от исходного файла каждый раз, когда она вызывается как оболочка, встроенная в оболочку, пока продолжается текущее окружение оболочки. [12140]A [12141]<&1[117799] - которые перенаправляются на текущую оболочку [117800]ARGV0[117801] - или [117802]$0[117803]. [12161]cat[117805] конкатенует свой [117806]<&0[12162]Standard-input[117809] file-descriptor - [117810]SCRIPT[117811] - над аргументом [117812]>[117813] усеченной текущей оболочки [117814]ARGV0[117815], или [117816]$0[117817]. [12163] Завершая уже считанную текущую [117818] составную команду [117819], [117820] исполнит [117821] исполняемый - и вновь переписанный - аргумент [117822] $0 [117823]. С момента вызова [117554]/файла [117555] до тех пор, пока в его инструкциях не будет указано, что он снова должен быть [117556]exec[117557]d, [117558]sh[117559] читает его в единственной составной команде [117560]] во время их выполнения, в то время как [117562]./файл[117563] сам [117564] ничего не делает вообще [117565], кроме как с радостью принимает его новое содержимое. На самом деле работают следующие файлы: [117566]/usr/bin/sh, /usr/bin/cat, /tmp/sh-something-or-ananeous.[12165]THANKS, AFTER ALL[12166]Так что когда @jw013 указывает, что:[12167]Файл, который принимает входные данные и производит выходные данные, это нормально...[12168]. ...на фоне его ошибочной критики этого ответа, он на самом деле невольно попустительствует единственному методу, используемому здесь, который в основном работает только на:[12169]ANSWER[12170]Все ответы здесь хорошие, но ни один из них не является полностью правильным. Похоже, все утверждают, что вы не можете динамически и постоянно следовать своим [117570]#!bang[117571]. Вот демонстрация установки не зависящего от пути шебанга:[12171]DEMO[12172]OUTPUT[12173]Видите? Мы просто перезаписываем сам скрипт. И это происходит только один раз после синхронизации [117572]git[117573]. С этого момента у него есть правильный путь в строке #!bang.[12174]Теперь почти все это просто пушок. Чтобы сделать это безопасно, вам понадобится:[12175]Функция, определенная сверху и вызываемая снизу, которая выполняет запись. Таким образом, мы сохраняем все, что нам нужно, в памяти и гарантируем, что весь файл будет прочитан, прежде чем мы начнем запись.[12176]Какой-то способ определить, каким должен быть путь. Команда [117824]-v[117825] неплохо подходит для этого.[12177]Heredocs действительно помогает, потому что это настоящие файлы. Тем временем они будут хранить ваш скрипт. Вы можете использовать и строки, но... [12178] Вы должны убедиться, что оболочка читает в команде, которая перезаписывает ваш скрипт в том же списке команд, что и выполняющая его. [12179] Смотрите: [12180] Заметьте, что я переместил команду [117582]exec[117583] только в одну строку. Теперь:[12181]Я не получаю вторую половину вывода, потому что сценарий не может прочитать в следующей команде. Тем не менее, потому что единственная команда, которой не хватало, была последней:[12182]Скрипт прошел так, как и должен был пройти - в основном потому, что все это было в heredoc - но если вы не спланируете все правильно, вы можете усечь ваш филестрим, что и случилось со мной выше.[117005].
    4
    27.01.2020, 19:44
    [117182]Вот один из способов получить самоизменяющийся скрипт, который исправит его сильный удар. Этот код должен быть подготовлен к вашему реальному сценарию.

    Некоторые комментарии:

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

    Он использует только старый синтаксис оболочки bourne, так как, несмотря на распространенное мнение, [117829]/bin/sh[117830] не гарантированно является POSIX оболочкой, даже в POSIX-совместимых операционных системах.

    Он устанавливает PATH на POSIX-совместимый, за которым следует список возможных zsh местоположений, чтобы избежать выбора "фальшивого" zsh.

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

    1
    27.01.2020, 19:44

    Теги

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