Как запустить программу с рабочим каталогом, отличным от текущего, из оболочки Linux? - PullRequest
306 голосов
/ 24 апреля 2009

Как использовать оболочку Linux, как запустить программу с другим рабочим каталогом из текущего рабочего каталога?

Например, у меня есть двоичный файл helloworld, который создает файл hello-world.txt в текущем каталоге. Этот файл находится внутри каталога /a. В данный момент я нахожусь в каталоге /b. Я хочу запустить мою программу под управлением ../a/helloworld и получить hello-world.txt где-то в третьем каталоге /c.

Ответы [ 11 ]

498 голосов
/ 24 апреля 2009

Назовите программу так:

(cd /c; /a/helloworld)

Скобки приводят к появлению субоболочки. Эта под-оболочка затем меняет свой рабочий каталог на /c, затем выполняет helloworld с /a. После выхода из программы суб-оболочка завершает работу, возвращая вас к вашему приглашению родительской оболочки в каталоге, из которого вы начали.

Обработка ошибок: Чтобы избежать запуска программы без изменения каталога, например, сделав ошибку /c, сделайте исполнение helloworld условным:

(cd /c && /a/helloworld)

Сокращение использования памяти: Чтобы избежать потери памяти в оболочке во время выполнения hello world, вызовите helloworld через exec:

(cd /c && exec /a/helloworld)

[Спасибо Джошу и Джулиано за советы по улучшению этого ответа!]

88 голосов
/ 24 апреля 2009

Аналогично ответу Дэвида Шмитта , а также предложению Джоша, но процесс запуска оболочки не запускается:

(cd /c && exec /a/helloworld)

Этот способ больше похож на то, как вы обычно запускаете команды в оболочке. Чтобы увидеть практическое отличие, вам нужно запустить ps ef из другой оболочки с каждым решением.

18 голосов
/ 13 июля 2015

Опция, которая не требует подоболочки и встроена в bash

(pushd SOME_PATH && run_stuff; popd)

Демо-версия:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
18 голосов
/ 24 апреля 2009
sh -c 'cd /c && ../a/helloworld'
11 голосов
/ 24 апреля 2009

Я всегда думаю, что инструменты UNIX должны быть написаны как фильтры, читать ввод из stdin и записывать вывод в stdout Если возможно, вы можете изменить свой двоичный файл helloworld, чтобы записать содержимое текстового файла в стандартный вывод, а не в конкретный файл. Таким образом, вы можете использовать оболочку для записи вашего файла в любом месте.

$ cd ~ / b

$ ~ / a / helloworld> ~ / c / helloworld.txt

5 голосов
/ 29 марта 2016

Просто измените последний "&&" на ";" и он вернется обратно, независимо от того, была ли команда выполнена неудачно или успешно:

cd SOME_PATH && run_some_command ; cd -
3 голосов
/ 24 апреля 2009

Один из способов сделать это - создать скрипт оболочки-оболочки.

Сценарий оболочки изменит текущий каталог на / c, затем запустит / a / helloworld. После выхода из сценария оболочки текущий каталог возвращается к /b.

.

Вот пример сценария оболочки bash:

#!/bin/bash
cd /c
/a/helloworld
1 голос
/ 02 января 2015

почему бы не сделать это простым

cd SOME_PATH && run_some_command && cd -

последняя команда 'cd' вернет вас в последний каталог pwd. Это должно работать на всех системах * nix.

1 голос
/ 24 апреля 2009

Если вы всегда хотите, чтобы он шел в / C, используйте абсолютный путь при записи файла.

0 голосов
/ 20 июня 2017

из текущего каталога укажите полный путь к каталогу скрипта для выполнения команды

/root/server/user/home/bin/script.sh
...