Как использовать оболочку Linux , как запустить программу с рабочим каталогом, отличным от текущего рабочего каталога?
Например, у меня есть двоичный файл, helloworld
который создает файл hello-world.txt
в текущем каталоге .
Этот файл находится внутри каталога /a
.
В данный момент я в каталоге /b
. Я хочу запустить мою программу ../a/helloworld
и получить hello-world.txt
где-нибудь в третьем каталоге /c
.
linux
shell
environment
Антон Данейко
источник
источник
su
помощью которого рабочий каталог сбрасывается в домашний каталог пользователя, которого вы указали, перед выполнением любых-c
команд. Это было очень полезно для меня.Ответы:
Назовите программу так:
Скобки приводят к появлению суб-оболочки. Затем эта вложенная оболочка меняет свой рабочий каталог на
/c
, а затем запускаетсяhelloworld
из/a
. После выхода из программы суб-оболочка завершает работу, возвращая вас к вашему приглашению родительской оболочки в каталоге, из которого вы начали.Обработка ошибок: Чтобы избежать запуска программы без изменения каталога, например, при наличии ошибки
/c
, сделайте выполнениеhelloworld
условия условным:Сокращение использования памяти: чтобы избежать потери памяти в оболочке во время выполнения hello world, позвоните
helloworld
через exec:[Спасибо Джошу и Джулиано за советы по улучшению этого ответа!]
источник
Аналогичен ответу Дэвида Шмитта , плюс предложение Джоша, но не дает запустить процесс оболочки:
Этот способ больше похож на то, как вы обычно запускаете команды в оболочке. Чтобы увидеть практическую разницу, вам нужно запускать
ps ef
из другой оболочки с каждым решением.источник
Опция, которая не требует подоболочки и встроена в bash
Демо-версия:
источник
pushd SOME_PATH && run_stuff && popd
если run_stuff завершится неудачей, popd не будет выполняться.set -e
в файле, и тогда это не удастсяpopd
.pushd "${SOME_PATH}" && run_stuff; popd
это лучше, чем текущий ответ, так как семантика pushd / popd была специально разработана для этой ситуации, чтобы перейти в какой-то каталог и затем вернуться к исходному.источник
Я всегда думаю, что инструменты UNIX должны быть написаны как фильтры, читать ввод из stdin и записывать вывод в stdout. Если возможно, вы можете изменить свой двоичный файл helloworld, чтобы записать содержимое текстового файла в стандартный вывод, а не в конкретный файл. Таким образом, вы можете использовать оболочку для записи вашего файла в любом месте.
$ cd ~ / b
$ ~ / a / helloworld> ~ / c / helloworld.txt
источник
Просто измените последний "&&" на ";" и он вернется, независимо от того, будет ли команда выполнена неудачно или успешно:
источник
Один из способов сделать это - создать скрипт оболочки.
Сценарий оболочки изменит текущий каталог на / c, затем запустит / a / helloworld. После выхода из сценария оболочки текущий каталог возвращается к / b.
Вот пример сценария оболочки bash:
источник
почему бы не сделать это простым
cd SOME_PATH && run_some_command && cd -
последняя команда 'cd' вернет вас в последний каталог pwd. Это должно работать на всех * nix системах.
источник
run_some_command
неcd -
получится, не будет выполнено.Если вы всегда хотите, чтобы он шел в / C, используйте абсолютный путь при записи файла.
источник
Если вы хотите выполнить это внутри вашей программы, то я бы сделал что-то вроде:
источник
из текущего каталога укажите полный путь к каталогу скрипта для выполнения команды
источник