Могу ли я использовать shebang для того, чтобы файл был исходным в текущем окружении bash?

Вы использовали yum для деинсталляции?

Я бы проверил любые скрипты startup/upstart/init.d, которые могут задерживаться.

В крайнем случае, если скриптов запуска нет, можно попробовать переместить его в каталог /tmp/:

sudo mv `which sosreport` /tmp/
3
23.06.2016, 08:52
5 ответов

Нет. К тому времени, когда в игру вступает шебанг, вы уже проиграли. Shebang применяется, когда процесс exec () 'd, и обычно это происходит после разветвления, так что вы уже находитесь в отдельном процессе. Шебанг читает не оболочка, а ядро.

16
27.01.2020, 21:07

Как говорит пользователь @muru, это невозможно сделать, потому что вы уже покинули сеанс оболочки, когда добрались до #! -строка.

Однако, в зависимости от того, что делают ваши файлы оболочки, может быть другое решение.

Я предполагаю, что они устанавливают переменные среды, которые вы используете для какого-то проекта.

Назовем проект сабтулом (потому что это мой проект).Затем у вас может быть сценарий, который устанавливает среду оболочки для проектов, например project-env :

#!/bin/bash

PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"

cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"

export PS1="[$PROJECT: \W] \$ "
exec bash -i

Запускать с:

$ ./project-env subtool

Это автоматически cd в данный проект вложенная папка под $ HOME / projects , прочтите файл среды проекта с именем subtool.env в этом случае (в котором вы инициализируете переменные), дайте вам приглашение командной строки для проекта и оставьте вы в интерактивном сеансе bash :

[subtool: subtool] $

Когда ваша работа будет завершена, просто выйдите из .

Это также дает преимущество изоляции среды проекта от «обычного» сеанса оболочки входа в систему и от других проектов.

5
27.01.2020, 21:07

О чем вы?

Вы не хотите, чтобы скрипт выполнялся сам по себе? Если сценарий предназначен для источника, он не должен даже иметь установленный исполняемый бит. Ни шебанга. Не быть помещенным в ваш PATH.

Вас раздражает ввод этих двух дополнительных символов, точки и пробела, во время живого сеанса bash? Просто определите псевдоним .

alias script.sh='. /path/to/script.sh'

И, как и исполняемые файлы в вашем PATH, псевдонимы будут автоматически заполняться при вводе.

ПС. Для PATH -, например включения вашей растущей коллекции скриптов, вы можете создать все псевдонимы в своем ~/.bashrc с помощью некоторого фрагмента, например:

for F in $(find /path/to/collection); do alias ${F##*/}=". $F"; done
0
27.01.2020, 21:07

Взрыв she -интерпретируется ядром при выполнении команды, а не оболочкой. Так что к тому времени уже слишком поздно.

Вы можете сделать это вместо этого:

#! /bin/echo Please run (from a Bourne-like shell):.

или:

#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
# 
#  . path/to/that/script
rest of the script

Чтобы сообщить пользователю, что он сделал неправильно.

Что должно работать в Linux. Замените все пробелы, кроме первого, одним из символов пробела, отличных от -ASCII (, например U+00A0, U+2006... )в некоторых других ОС. Возможно, вам придется изменить путь к утилитам echoили sed.

5
27.01.2020, 21:07

То, что вы хотите сделать в этих сценариях.'ed, изменяет процесс оболочки; поэтому вам нужно вызывать их из процесса оболочки; что означает либо псевдонимы, либо их более мощные функции оболочки братьев. Это означает, что вам нужно выполнить некоторые настройки в.profile или его эквиваленте.

Трюк с псевдонимом несколько упрощен :псевдоним mytool1=". /my/library/mytool1.sh"

Можете ли вы прочитать все в начале?.профиль :. /my/library/define _tools.sh

определение _mytools.sh :mytool1 (){... содержимое mytool1.sh... } mytool2 (){...; }

-1
27.01.2020, 21:07

Теги

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