argv[0]
не усекается при наличии пробелов. Однако он будет иметь имя программы, а не путь, когда программа запускается из каталога, указанного в переменной среды PATH.
В любом случае, то, что вы пытаетесь сделать здесь, не является хорошим дизайном для программы Unix / Linux. Файлы данных не хранятся в том же каталоге, что и программные файлы, поскольку это затрудняет применение надлежащих политик безопасности.
На мой взгляд, лучший способ получить то, что вы хотите, - это использовать скрипт оболочки для запуска самой программы. Это очень похоже на запуск Firefox в системах Linux. Оболочка помещает имя скрипта в $0
, и эта переменная всегда будет иметь путь. Затем вы можете использовать переменную среды или аргумент командной строки, чтобы указать вашей программе расположение файлов данных, например:
dir=`dirname "$0"`
cd "$dir/../data/"
"$dir/real-program"
И я бы устроил вашу программу так, чтобы ее файлы были примерно такими:
install-dir/bin/program
install-dir/bin/real-program
install-dir/etc/config
install-dir/data/book-file.mobi