How can I get the current working directory? [duplicate]
I want to have a script that takes the current working directory to a variable. The section that needs the directory is like this dir = pwd . It just prints pwd how do I get the current working directory into a variable?
5 Answers 5
There’s no need to do that, it’s already in a variable:
The PWD variable is defined by POSIX and will work on all POSIX-compliant shells:
Set by the shell and by the cd utility. In the shell the value shall be initialized from the environment as follows. If a value for PWD is passed to the shell in the environment when it is executed, the value is an absolute pathname of the current working directory that is no longer than
For the more general answer, the way to save the output of a command in a variable is to enclose the command in $() or ` ` (backticks):
Of the two, the $() is preferred since it is easier to build complex commands like command0 $(command1 $(command2 $(command3))) .
How to get the path to the current file (pwd) in Linux from C?
I’d like to know if it is somehow possible to run system(«pwd») on the current DIR. So for example let’s have this folder structure:
And with opendir() and readdir() I’ll get to file3 , and I want to use system(«pwd») to get the path . /example/test2/file3 . Is this somehow possible, or will pwd return the path to main.c all the time?
5 Answers 5
Simply opening and reading directories does not change the current working directory. However, changing directory in your program will.
You can use chdir(2) to change dir from C, then system(«pwd»); will give you what ever directory you chdir ‘ed to.
The C-equvivalent of the pwd -command is getcwd(3).
For POSIX systems I found three solutions:
Get value from an environment variables «PWD»
Use getcwd()
Execute system command «pwd» and read output
When you use system(. ) call with Windows and Linux it just executes one command. It is possible to do the same using file with commands (you can create it with C code), but my oppinion is, that you should use nftw() to get dirrectories and after that use opendir()/readdir().
How to not hardcode the path length with pathconf
I believe this is the correct way to do it:
The value returned for the variable
indicates the longest relative pathname that could be given if the specified directory is the process’ current working directory. A process may not always be able to generate a name that long and use it if a subdirectory in the pathname crosses into a more restrictive file system.
Tested on Ubuntu 18.10, n == 4096 in this implementation.
Переменная PATH в Linux
Когда вы запускаете программу из терминала или скрипта, то обычно пишете только имя файла программы. Однако, ОС Linux спроектирована так, что исполняемые и связанные с ними файлы программ распределяются по различным специализированным каталогам. Например, библиотеки устанавливаются в /lib или /usr/lib, конфигурационные файлы в /etc, а исполняемые файлы в /sbin/, /usr/bin или /bin.
Таких местоположений несколько. Откуда операционная система знает где искать требуемую программу или её компонент? Всё просто — для этого используется переменная PATH. Эта переменная позволяет существенно сократить длину набираемых команд в терминале или в скрипте, освобождая от необходимости каждый раз указывать полные пути к требуемым файлам. В этой статье мы разберёмся зачем нужна переменная PATH Linux, а также как добавить к её значению имена своих пользовательских каталогов.
Переменная PATH в Linux
Для того, чтобы посмотреть содержимое переменной PATH в Linux, выполните в терминале команду:
На экране появится перечень папок, разделённых двоеточием. Алгоритм поиска пути к требуемой программе при её запуске довольно прост. Сначала ОС ищет исполняемый файл с заданным именем в текущей папке. Если находит, запускает на выполнение, если нет, проверяет каталоги, перечисленные в переменной PATH, в установленном там порядке. Таким образом, добавив свои папки к содержимому этой переменной, вы добавляете новые места размещения исполняемых и связанных с ними файлов.
Для того, чтобы добавить новый путь к переменной PATH, можно воспользоваться командой export. Например, давайте добавим к значению переменной PATH папку/opt/local/bin. Для того, чтобы не перезаписать имеющееся значение переменной PATH новым, нужно именно добавить (дописать) это новое значение к уже имеющемуся, не забыв о разделителе-двоеточии:
Теперь мы можем убедиться, что в переменной PATH содержится также и имя этой, добавленной нами, папки:
Вы уже знаете как в Linux добавить имя требуемой папки в переменную PATH, но есть одна проблема — после перезагрузки компьютера или открытия нового сеанса терминала все изменения пропадут, ваша переменная PATH будет иметь то же значение, что и раньше. Для того, чтобы этого не произошло, нужно закрепить новое текущее значение переменной PATH в конфигурационном системном файле.
В ОС Ubuntu значение переменной PATH содержится в файле /etc/environment, в некоторых других дистрибутивах её также можно найти и в файле /etc/profile. Вы можете открыть файл /etc/environment и вручную дописать туда нужное значение:
sudo vi /etc/environment
Можно поступить и иначе. Содержимое файла .bashrc выполняется при каждом запуске оболочки Bash. Если добавить в конец файла команду export, то для каждой загружаемой оболочки будет автоматически выполняться добавление имени требуемой папки в переменную PATH, но только для текущего пользователя:
Выводы
В этой статье мы рассмотрели вопрос о том, зачем нужна переменная окружения PATH в Linux и как добавлять к её значению новые пути поиска исполняемых и связанных с ними файлов. Как видите, всё делается достаточно просто. Таким образом вы можете добавить столько папок для поиска и хранения исполняемых файлов, сколько вам требуется.
How do I get the path of a process in Unix / Linux
In Windows environment there is an API to obtain the path which is running a process. Is there something similar in Unix / Linux?
Or is there some other way to do that in these environments?
11 Answers 11
On Linux, the symlink /proc/
/exe has the path of the executable. Use the command readlink -f /proc/
/exe to get the value.
On AIX, this file does not exist. You could compare cksum and cksum /proc/
You can find the exe easily by these ways, just try it yourself.
gave me the location of the symbolic link so I could find the logs and stop the process in proper way. – NurShomik Apr 12 ’18 at 0:58
A little bit late, but all the answers were specific to linux.
If you need also unix, then you need this:
EDITED: Fixed the bug reported by Mark lakata.
Replace 786 with your PID or process name.
This command will fetch the process path from where it is executing.
In Linux every process has its own folder in /proc . So you could use getpid() to get the pid of the running process and then join it with the path /proc to get the folder you hopefully need.
Here’s a short example in Python:
Here’s the example in ANSI C as well:
There’s no «guaranteed to work anywhere» method.
Step 1 is to check argv[0], if the program was started by its full path, this would (usually) have the full path. If it was started by a relative path, the same holds (though this requires getting teh current working directory, using getcwd().
Step 2, if none of the above holds, is to get the name of the program, then get the name of the program from argv[0], then get the user’s PATH from the environment and go through that to see if there’s a suitable executable binary with the same name.
Note that argv[0] is set by the process that execs the program, so it is not 100% reliable.