Исполняемый файл, находящийся в местоположении A, как запустить его в местоположении B?

Итак, у меня есть исполняемый файл на моем сервере debian, и этот исполняемый файл находится в /home/human/ExecuteIt , но я не могу понять, как запустить мой исполняемый файл в другом месте. В моем случае это /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/ .

Обычно для всего одной папки конфигурации я могу просто скопировать / вставить исполняемый файл в /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/ а затем с помощью sudo chmod +x ./executable запустить его успешно, но мой исполняемый файл имеет несколько папок конфигурации, которые содержат различной конфигурации.

Было бы здорово, если бы я мог выполнить мой исполняемый файл отдельно и выполнить его с другой конфигурацией без копирования / вставки. Есть ли способ выполнить мой исполняемый файл в другом месте?

Если ваш исполняемый файл является источником данных, он имеет конфигурацию из относительного пути, этот путь относится к pwd (настоящий рабочий каталог). Так:

 > cd /there/locA > pwd /there/locA > /there/stuff/executable 

Исполняемый файл будет выглядеть относительно locB. Теперь:

 > cd /there/locB > pwd /there/locB > /there/stuff/executable 

Исполняемый файл будет выглядеть относительно locB.

Если вы имеете в виду, что вы хотите, чтобы вы запускали исполняемый файл, а pwd – locB, но волшебным образом отправляли конфигурацию из locB, ответ заключается в том, что единственный способ сделать это – как-то сказать исполняемому файлу, например, параметр строки, с помощью которого можно вызвать его, или с помощью настраиваемой переменной среды. Просто скопируйте исполняемый файл в locA, а затем попытайтесь вызвать его специально из locB, ожидая, что он будет использовать locA, поскольку pwd не будет работать – pwd все равно locB.

Я замечаю установку $ PWD для одной команды:

 > PWD=/there/locA bash -c 'echo $PWD' /there/locB 

не работает. Поэтому, возможно, вы не можете подделать pwd.

Я не уверен, что понимаю ваш вопрос, поэтому я повторю то, что понимаю своими словами. У вас есть программа, которая ищет свои файлы конфигурации в том же каталоге, в котором находится программа. Например, если вы запустите /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/executable , он ищет файлы конфигурации в /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1 . Вы хотите иметь возможность запускать программу с различными конфигурациями, например /home/human/ExecuteIt/FolderWithConfiaguration/Configuration2 . И вы не хотите делать несколько копий программы.

Вы можете создавать символические ссылки на исполняемый файл в нескольких каталогах, а также создавать символические ссылки на все распространенные файлы. Например, предположим, что программа требует трех файлов: исполняемый executable , данные файла data и конфигурацию файла config . У вас есть две разные конфигурации, которые вы вводите в /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/config и /home/human/ExecuteIt/FolderWithConfiaguration/Configuration2/config . У вас есть одна копия исполняемого файла и файла данных, как в /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/ . И вы создаете символическую ссылку на /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/executable в каталоге /home/human/ExecuteIt/FolderWithConfiaguration/Configuration2/ , а также символическую ссылку на /home/human/ExecuteIt/FolderWithConfiaguration/Configuration1/data .

 cd /home/human/ExecuteIt/FolderWithConfiaguration/Configuration2 ln -s ../Configuration1/executable ../Configuration1/data 

Символические ссылки говорят системе искать реальный файл в другом месте. Они не содержат никаких данных, поэтому, если вы обновляете исполняемый файл или данные в Configuration1 , это относится ко всей конфигурации; и есть только одна копия файлов, поэтому для дополнительных конфигураций требуется только место на диске для файла конфигурации.

Большинство программ, которые ведут себя таким образом, учитывают местоположение исполняемого файла при поиске файлов данных и конфигурации. Если вы следуете символической ссылке, этот метод не будет работать. Вместо этого вы можете сделать жесткую ссылку . Жесткие ссылки – это несколько путей для одних и тех же файлов; все жесткие ссылки на файл эквивалентны.

 cd /home/human/ExecuteIt/FolderWithConfiaguration/Configuration2 ln ../Configuration1/executable ../Configuration1/data 

Это затрудняет обновление файлов, поскольку вам необходимо обновить файл, указанный всеми путями. Кроме того, все жесткие ссылки на один и тот же файл должны быть в одной и той же файловой системе.