Вы использовали yum для деинсталляции?
Я бы проверил любые скрипты startup/upstart/init.d, которые могут задерживаться.
В крайнем случае, если скриптов запуска нет, можно попробовать переместить его в каталог /tmp/:
sudo mv `which sosreport` /tmp/
Нет. К тому времени, когда в игру вступает шебанг, вы уже проиграли. Shebang применяется, когда процесс exec ()
'd, и обычно это происходит после разветвления, так что вы уже находитесь в отдельном процессе. Шебанг читает не оболочка, а ядро.
Как говорит пользователь @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] $
Когда ваша работа будет завершена, просто выйдите из
.
Это также дает преимущество изоляции среды проекта от «обычного» сеанса оболочки входа в систему и от других проектов.
О чем вы?
Вы не хотите, чтобы скрипт выполнялся сам по себе? Если сценарий предназначен для источника, он не должен даже иметь установленный исполняемый бит. Ни шебанга. Не быть помещенным в ваш PATH.
Вас раздражает ввод этих двух дополнительных символов, точки и пробела, во время живого сеанса bash? Просто определите псевдоним .
alias script.sh='. /path/to/script.sh'
И, как и исполняемые файлы в вашем PATH, псевдонимы будут автоматически заполняться при вводе.
ПС. Для PATH -, например включения вашей растущей коллекции скриптов, вы можете создать все псевдонимы в своем ~/.bashrc с помощью некоторого фрагмента, например:
for F in $(find /path/to/collection); do alias ${F##*/}=". $F"; done
Взрыв 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
.
То, что вы хотите сделать в этих сценариях.'ed, изменяет процесс оболочки; поэтому вам нужно вызывать их из процесса оболочки; что означает либо псевдонимы, либо их более мощные функции оболочки братьев. Это означает, что вам нужно выполнить некоторые настройки в.profile или его эквиваленте.
Трюк с псевдонимом несколько упрощен :псевдоним mytool1=". /my/library/mytool1.sh"
Можете ли вы прочитать все в начале?.профиль :. /my/library/define _tools.sh
определение _mytools.sh :mytool1 (){... содержимое mytool1.sh... } mytool2 (){...; }