Программно изменить cwd оболочки портативным способом - PullRequest
2 голосов
/ 24 мая 2011

Я хотел бы написать инструмент командной строки на C, который действует как расширенная команда "cd" или "pushd / popd", которую можно перенести в Windows / Mac / Linux.(Полная информация, если вам интересно, находится на http://alsweigart.tumblr.com/post/4008393181/command-line-idea-up)

Проблема в том, что когда пользователь запускает программу из оболочки, изменение текущего рабочего каталога изменит cwd программы,вместо cwd оболочки.

Есть ли способ написать программу, которая делает то, что я хочу, или мне придется прибегнуть к написанию скриптов / пакетных файлов bash?

В качестве альтернативы, есть лиКак я могу передать вывод программы для запуска в качестве команды оболочки?т.е. программа выводит "cd / foo / bar", а скрипт оболочки вызывает эту программу и запускает ее вывод в виде команды оболочки.

Ответы [ 4 ]

4 голосов
/ 24 мая 2011

Как правило, один процесс не может изменить текущий каталог другого процесса (это верно как для систем Windows, так и для систем Unix). Поэтому программа, которая запускается как отдельный процесс вне оболочки, не может изменить текущий каталог оболочки.

Скорее всего, вам придется использовать некоторую комбинацию командных файлов и / или сценариев оболочки для выполнения того, что вы хотите сделать. Обратите внимание, что хотя пакетные файлы Windows могут изменять текущий каталог оболочки, в которой они выполняются, это не верно для сценариев оболочки в Unix. В случае Unix вы, вероятно, захотите использовать shell functions , которые выполняются в одном и том же процессе. Обратите внимание, что написание функций оболочки зависит от оболочки, поэтому вам придется портировать вашу программу на каждую оболочку Unix, которую вы также хотите поддерживать.

В некоторых оболочках Unix вы можете запустить скрипт оболочки в контексте текущей оболочки, используя команду .. Если ваша оболочка поддерживает это, вы можете использовать псевдоним оболочки для его запуска, чтобы вам не приходилось вводить . перед вашей командой.

1 голос
/ 24 мая 2011

Управление рабочим каталогом оболочки - это то, что должна делать сама оболочка - вы не можете написать программу для этого. Что касается вашего второго вопроса, пожалуйста, опубликуйте пример того, о чем вы спрашиваете.

0 голосов
/ 24 мая 2011
$(echo "cd /foo/bar")

Это демонстрирует, как вы можете сделать это с помощью оболочки POSIX. Конечно, он не переносим с оболочкой Windows.

0 голосов
/ 24 мая 2011

Решение состоит в том, чтобы создать функцию оболочки, которая запускает программу, а затем создает компакт-диск с результатом.

mycd()
{
  cd `mycdprogram "$@"`
}

Вы можете запустить ее как mycd Please change my directory to /tmp или любые другие аргументы, которые принимает ваша программа.

Для другой команды вы можете сделать что-то вроде:

myrun()
{
   eval `myprogram "$@"`
}

И оболочка будет выполнять все команды оболочки, которые генерирует myprogram.

Все это, конечно, для оболочек POSIX.

...