Подумайте про команду 'source', як у операції 'include'. Він бере зміст аргументу і запускає його так, як ніби він був запущений безпосередньо. У цьому випадку ваша команда - "джерело" з аргументом "run.sh", а run.sh виконується точно так, як би ви ввели вміст run.sh у свій командний рядок.
Коли ви запускаєте './run.sh', './run.sh' - це ваша команда, і вона не має аргументів. Оскільки цей файл є текстовим та не двійковим, ваша оболонка шукає інтерпретатора в shebang ('#!' В першому рядку) і знаходить '/ bin / bash'. Тоді ваша оболонка запускає новий екземпляр bash, а вміст run.sh запускається всередині цього нового екземпляра.
У першому випадку, коли bash досягає команди 'exit', він виконується точно так, як би ви ввели його в командний рядок. У другому випадку він виконується в баш-процесі, і ваша оболонка запускається, таким чином, лише цей екземпляр bash отримує команду 'exit'.
Коли ви вводите рядок у bash, все, що перед першим пробілом, трактується як команда, а все, що випливає, трактується як аргументи. Команда '.' є псевдонімом "джерела". Коли ти біжиш '. run.sh 'the'. " це власна команда, оскільки вона відокремлена від аргументів пробілом. Коли ви запускаєте './run.sh', ваша команда - './run.sh' і '.' є частиною відносного шляху до run.sh з '.' що представляє вашу поточну папку.
$- = *i*?