Запустити скрипт у поточній оболонці без. перед командою


26

Якщо сценарій повинен бути виконаний у поточній оболонці, це можна досягти, додавши крапку перед командою:

   . ./somescript.sh

Чи є спосіб це зробити, не вводячи крапку кожен раз? Наприклад команда змінити батьківську оболонку із самого сценарію?

Відповіді:


22

Це може бути не саме те, що ви хочете, але ви могли б зробити:

alias somescript.sh='. ./somescript.sh'

2
Це прекрасно вирішило мою проблему. Дякую!
alu

8

Чи є спосіб це зробити, не вводячи крапку кожен раз? Наприклад команда змінити батьківську оболонку із самого сценарію?

Я не думаю, що існує (крім набору тексту) source somescript.sh , але це, мабуть, не те, що ви шукаєте ^^).

Якщо ви запускаєте скрипт як завжди ./somescript.sh, оболонка розгортає та виконує цю команду. Він передає команду ядру, а потім ядро ​​вирішує, як цю команду виконувати, розбираючи #!рядок всередині сценарію. Потім ядро ​​запускає вказаний інтерпретатор (у цьому випадку, мабуть, bashпідпакет). Для цього модифікаціїsomescript.sh навколишнього середовища виділяються в нижній частині корпусу, не впливаючи на батьківську оболонку.

Якщо ви хочете, щоб оболонка читала сам скрипт, не запускаючи інший процес, вам явно потрібно повідомити його, використовуючи .або sourceключове слово.


Дякую за детальне пояснення. :) Тепер я бачу, що немає ніякого способу зробити це з виклику скрипту, але на щастя батьківській оболонці можна сказати не створювати підзарядку з aliasкомандою, як запропонував Скотт.
alu

1

Якщо ви виконуєте ./somescript.sh як зовнішню програму, вона не може нічого робити в процесі запущеної оболонки, наприклад, отримати доступ до неекспортованих змінних, встановлення змінних, зміна поточного каталогу тощо. Цього не обійти.

(Ну гаразд, можливо, ви зможете запустити налагоджувач з підпроцесу і налаштувати пам'ять батьківського процесу. Але якщо ви спробуєте це, найімовірнішим результатом буде збій батьківської оболонки.)

Вам потрібно бігти . ./somescript.sh. Ви можете приховати це за псевдонімом або функцією, якщо вам подобається, але знову-таки псевдонім або визначення функції потрібно зробити в батьківській оболонці.


0

Я думаю, що сценарій, який ви намагаєтеся запустити, не виконується. chmod a+x somescript.shдодасть у цей файл біт виконання для користувача, групи та інших (ugo). Перший рядок файлу також знадобиться #! рядок вгорі, як #!/bin/bash.

ls -l somescript.shпокаже трійку rwx (читання / запис / виконання) для файлу. Потрібно знадобитися х хоча б у першому наборі, якщо припустити, що ви володієте файлом.


Самі сценарії справно працюють, але я хочу виконати його в поточній оболонці, щоб мати змогу змінювати змінні середовища оболонки.
alu

Якщо експорт потрібної змінної в скрипті не працює, як-от export PATH=$PATH:/usr/local/binдодати / usr / local / bin до вашої $ PATH, тоді вам потрібно джерело файлу, щоб змінити змінні вашого поточного середовища. Це питання насправді "Як я можу програматично змінити змінні середовища в моїй запущеній оболонці із скрипту bash?" Сценарій . ./somescript.shвиконується просто чудово - ви використовуєте команду dot для джерела у файлі. tcsh використовує "джерело" для того ж самого.
AR Diederich

Модифікація змінної була лише прикладом. Моє запитання - чи можна сказати оболонці, що має бути крапка, не фактично писати її (наприклад, із самого сценарію)
alu

Точка може бути легко забута, що може повністю змінити поведінку сценарію.
alu

0
export PATH=$PATH:.

Запустивши цю команду в оболонці або додавши її до файлу конфігурації оболонки, додасть поточну директорію до змінної PATH. Змінна PATH - це список каталогів, де ваша оболонка буде шукати двійкові файли, які потрібно виконати при видачі команди.

Це дозволить вам запустити будь-який виконуваний файл у поточному каталозі без ./


1
ОП запитує про перше, а .не про ./те, що є частиною імені файлу. Запуск ./somescript не виконує його в поточній оболонці, як . ./somescriptце робиться.
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.