Как вызвать bash, запустить команды внутри новой оболочки и затем вернуть управление пользователю?

Это должно быть действительно просто или очень сложно, но я ничего не мог найти об этом … Я пытаюсь открыть новый экземпляр bash, затем запустить несколько команд внутри него и вернуть управление пользователю внутри тот же экземпляр .

Я пытался:

$ bash -lic "some_command" 

но это выполняет some_command внутри нового экземпляра, а затем закрывает его. Я хочу, чтобы он оставался открытым.

Еще одна деталь, которая может повлиять на ответы: если я смогу заставить это работать, я буду использовать его в моем .bashrc как псевдонимы (es), так что бонусные баллы за реализацию alias !

 bash --rcfile <(echo '. ~/.bashrc; some_command') 

удаляет создание временных файлов. Вопрос на других сайтах:

Это поздний ответ, но у меня была одна и та же проблема, и Google отправил меня на эту страницу, поэтому для полноты здесь я выяснил, как я столкнулся с этой проблемой.

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

Сломанное решение : простейшая и очевидная попытка:

 bash -c 'XXXX ; bash' 

Это частично работает (хотя и с дополнительным уровнем оболочки). Однако проблема заключается в том, что, хотя суб-shell наследует экспортируемые переменные среды, псевдонимы и функции не наследуются. Таким образом, это может работать для чего-то, но не является общим решением.

Лучше : путь вокруг этого состоит в том, чтобы динамически создать файл запуска и вызвать bash с этим новым файлом инициализации, убедившись, что ваш новый файл инициализации вызывает ваш обычный ~ / .bashrc, если это необходимо.

 # Create a temporary file TMPFILE=$(mktemp) # Add stuff to the temporary file echo "source ~/.bashrc" > $TMPFILE echo "" >> $TMPFILE echo "rm -f $TMPFILE" >> $TMPFILE # Start the new bash shell bash --rcfile $TMPFILE 

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

Примечание. Я не уверен, что / etc / bashrc обычно называется частью обычной оболочки без входа. Если это так, вы можете захотеть указать источник / etc / bashrc, а также ваш ~ / .bashrc.

Вы можете передать --rcfile в Bash, чтобы заставить его читать файл по вашему выбору. Этот файл будет считан вместо вашего .bashrc . (Если это проблема, source ~/.bashrc из другого скрипта.)

Edit: Таким образом, функция запуска новой оболочки с материалом из ~/.more.sh будет выглядеть примерно так:

 more() { bash --rcfile ~/.more.sh ; } 

… и в .more.sh вас будут команды, которые вы хотите выполнить при запуске оболочки. (Я полагаю, было бы элегантно избегать отдельного файла запуска – вы не можете использовать стандартный ввод, потому что тогда shell не будет интерактивной, но вы можете создать загрузочный файл из этого документа во временном месте, а затем прочитать его.)

Вы можете получить нужную функциональность, заменив скрипт вместо его запуска. например:

 $ cat script
 cmd1
 cmd2
 $.  скрипт
 $ в этой точке cmd1 и cmd2 были запущены внутри этой оболочки

Добавьте в ~/.bashrc раздел, подобный этому:

 if [ "$subshell" = 'true' ] then # commands to execute only on a subshell date fi alias sub='subshell=true bash' 

Затем вы можете запустить подоболочку с sub .

В соответствии с ответом daveraja , вот сценарий bash, который решит цель.

Рассмотрим ситуацию, если вы используете C-shell и хотите выполнить команду, не выходя из контекста / windows C-shell следующим образом,

Выполняемая команда : поиск точного слова «Тестирование» в текущей директории рекурсивно только в файлах * .h, * .c

 grep -nrs --color -w --include="*.{h,c}" Testing ./ 

Решение 1. Войдите в bash из C-оболочки и выполните команду

 bash grep -nrs --color -w --include="*.{h,c}" Testing ./ exit 

Решение 2. Запишите заданную команду в текстовый файл и выполните ее с помощью bash

 echo 'grep -nrs --color -w --include="*.{h,c}" Testing ./' > tmp_file.txt bash tmp_file.txt 

Решение 3. Запустите команду в той же строке, используя bash

 bash -c 'grep -nrs --color -w --include="*.{h,c}" Testing ./' 

Решение 4. Создайте sciprt (одноразовый) и используйте его для всех будущих команд

 alias ebash './execute_command_on_bash.sh' ebash grep -nrs --color -w --include="*.{h,c}" Testing ./ 

Сценарий выглядит следующим образом:

 #!/bin/bash # ========================================================================= # References: # https://stackoverflow.com/a/13343457/5409274 # https://stackoverflow.com/a/26733366/5409274 # https://stackoverflow.com/a/2853811/5409274 # https://stackoverflow.com/a/2853811/5409274 # https://www.linuxquestions.org/questions/other-%2Anix-55/how-can-i-run-a-command-on-another-shell-without-changing-the-current-shell-794580/ # https://www.tldp.org/LDP/abs/html/internalvariables.html # https://stackoverflow.com/a/4277753/5409274 # ========================================================================= # Enable following line to see the script commands # getting printing along with their execution. This will help for debugging. #set -o verbose E_BADARGS=85 if [ ! -n "$1" ] then echo "Usage: `basename $0` grep -nrs --color -w --include=\"*.{h,c}\" Testing ." echo "Usage: `basename $0` find . -name \"*.txt\"" exit $E_BADARGS fi # Create a temporary file TMPFILE=$(mktemp) # Add stuff to the temporary file #echo "echo Hello World...." >> $TMPFILE #initialize the variable that will contain the whole argument string argList="" #iterate on each argument for arg in "[email protected]" do #if an argument contains a white space, enclose it in double quotes and append to the list #otherwise simply append the argument to the list if echo $arg | grep -q " "; then argList="$argList \"$arg\"" else argList="$argList $arg" fi done #remove a possible trailing space at the beginning of the list argList=$(echo $argList | sed 's/^ *//') # Echoing the command to be executed to tmp file echo "$argList" >> $TMPFILE # Note: This should be your last command # Important last command which deletes the tmp file last_command="rm -f $TMPFILE" echo "$last_command" >> $TMPFILE #echo "---------------------------------------------" #echo "TMPFILE is $TMPFILE as follows" #cat $TMPFILE #echo "---------------------------------------------" check_for_last_line=$(tail -n 1 $TMPFILE | grep -o "$last_command") #echo $check_for_last_line #if tail -n 1 $TMPFILE | grep -o "$last_command" if [ "$check_for_last_line" == "$last_command" ] then #echo "Okay..." bash $TMPFILE exit 0 else echo "Something is wrong" echo "Last command in your tmp file should be removing itself" echo "Aborting the process" exit 1 fi 
  • Sudo с паролем в одной командной строке?
  • Как удалить файлы в командной строке с регулярными выражениями?
  • Запустите приложение GUI на удаленном компьютере с SSH
  • Дилемма подошвы в теперешнем цикле в Баше
  • Как установить Bash на Ubuntu в Windows 10?
  • Могу ли я ssh где-нибудь, запустить некоторые команды, а затем оставить себе подсказку?
  • Как использовать строки файла в качестве аргументов команды?
  • Когда нам нужны фигурные скобки вокруг переменных оболочки?
  • Как добавить вывод в конец текстового файла в сценарии оболочки / bash
  • Linux-оболочка: как добавить строку префикса в сообщение stderr?
  • Значки наложения TortoiseSVN не отображаются при установке другой учетной записью пользователя?
  • Interesting Posts

    Entity Framework. Есть ли способ автоматически загружать дочерние объекты без Include ()?

    Xcode 6 позволяет объектам VECTOR image … любой идеи, как их использовать?

    Deserialize неизвестный тип с protobuf-net

    Преобразование файла дампа SQLITE SQL в POSTGRESQL

    Скорость соединения снижается с 1 Гбит / с до 10 Мбит / с (Vista 64)

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

    В MVC, как мне вернуть результат строки?

    Хотя в сеансе удаленного рабочего стола в Windows 7, Alt-Tab, чтобы вернуться к главной машине

    Правильный способ разбить std :: string на вектор

    Доступ к членам classа по указателю NULL

    В браузере Google Chrome, почему Gmail использует большую часть процессора при включении аппаратного ускорения?

    Можно ли удалить Android-приложение для удаления?

    Скрыть TabLayout на прокрутке содержимого вместо ToolBar

    Что такое `lr_policy` в Caffe?

    Утечка памяти при перераспределении приложения в Tomcat

    Давайте будем гением компьютера.