Pokud uvedete jenom název programu (bez cesty), tedy ve vašem případě
ABC --portable
hledá se program na aktuální cestě (proměnná prostředí $PATH). To je důvod, proč nebude fungovat postup, který popsal 00.
Pokud chcete spustit program na konkrétní cestě, musíte uvést tu cestu – relativní nebo absolutní. Když chcete spustit skript program z aktuálního adresáře, musíte tedy uvést
./ABC --portable
Pokud byste to takhle napsal do skriptu, aktuální adresář je ten, ve kterém skript spouštíte, ne ten, kde je umístěn skript. Takže by vám to fungovalo jen v případě, kdy byste byl v tom adresáři se skriptem. Kdybyste ho spustil třeba příkazem
./dir/script.sh
nebude vám to fungovat.
Takže potřebujete zjistit adresář, ve kterém se ten spouštěcí skript nachází, abyste mohl program zavolat ze správného adresáře. Jméno aktuálně spouštěného programu/příkazu je uložené v proměnné prostředí $0, takže ve skriptu příkazem
echo $0
zjistíte, jak jste skript spustil. Když tedy skript spustíte příkazem
./dir/script.sh
bude $0 obsahovat právě to ./dir/script.sh.
Teď už tedy máte cestu ke skriptu, a z ní dokážete odvodit cestu k programu. Potřebujete jenom z cesty k souboru udělat cestu k nadřazenému adresáři, k tomu slouží příkaz dirname. Takže ten skript může vypadat takhle nějak:
#!/bin/sh
"`dirname \"$0\"`/ABC --portable"
První řádek říká jádru (nebo shellu, kdybyste to spouštěl na jiném systému, kde to jádro nepodporuje), že má daný skript spustit s pomocí příkazu /bin/sh.
Skriptu pak musíte nastavit právo ke spuštění, jak psal 00.
Ten skript pak můžete volat odkudkoli a vždy spustí program ABC v tom adresáři, kde je uvedený skript. Nebude to fungovat v případě, že byste si na skript udělal symbolický odkaz – ale i to se dá ve skriptu ošetřit.
Pokud byste potřeboval, aby se program spustil vždy s aktuálním adresářem nastaveným na adresář, kde je ten program, před zavoláním programu se pomocí cd do příslušného adresáře přesuňte:
#!/bin/sh
cd "`dirname \"$0\"`"
./ABC --portable
Ty dvojité uvozovky ošetřují případy, kdy by v cestě byla mezera – aby to bylo chápáno jako jeden parametr a mezera to nerozdělila na víc parametrů. Obrácené apostrofy udělají to, že se text v nich uvedený spustí jako příkaz a jeho výstup se vloží na místo toho příkazu.