Location of ini/config files in linux/unix?
You should adhere your application to the XDG Base Directory Specification. Most answers here are either obsolete or wrong.
Your application should store and load data and configuration files to/from the directories pointed by the following environment variables:
- $XDG_DATA_HOME (default: «$HOME/.local/share» ): user-specific data files.
- $XDG_CONFIG_HOME (default: «$HOME/.config» ): user-specific configuration files.
- $XDG_DATA_DIRS (default: «/usr/local/share/:/usr/share/» ): precedence-ordered set of system data directories.
- $XDG_CONFIG_DIRS (default: «/etc/xdg» ): precedence-ordered set of system configuration directories.
- $XDG_CACHE_HOME (default: «$HOME/.cache» ): user-specific non-essential data files.
You should first determine if the file in question is:
- A configuration file ( $XDG_CONFIG_HOME:$XDG_CONFIG_DIRS );
- A data file ( $XDG_DATA_HOME:$XDG_DATA_DIRS ); or
- A non-essential (cache) file ( $XDG_CACHE_HOME ).
It is recommended that your application put its files in a subdirectory of the above directories. Usually, something like $XDG_DATA_DIRS//filename or $XDG_DATA_DIRS///filename .
When loading, you first try to load the file from the user-specific directories ( $XDG_*_HOME ) and, if failed, from system directories ( $XDG_*_DIRS ). When saving, save to user-specific directories only (since the user probably won’t have write access to system directories).
For other, more user-oriented directories, refer to the XDG User Directories Specification. It defines directories for the Desktop, downloads, documents, videos, etc.
I see that that specification is by freedesktop.org, which works on “interoperability and shared technology for X Window System desktops”. I’m not sure exactly what a “X Window System desktop” is, but not even xterm within X11.app has those environment variables. So this answer doesn’t apply to all Unixes.
As a note to those who mention that these aren’t always defined, if those variables don’t exist, then you should use the specified default values. For instance, in a shell script you could add to the top of your script : $
If you’re writing cross-platform, for windows, you should fallback $HOME to $USERPROFILE or $APPDATA with $XDG_DATA_DIRS pointing to :$APPDATA:$PROGRAMDATA .
@RoryO’Kane I believe Brian Campbell answers your question. You should check whether $XDG_CONFIG_HOME, etc., are defined and if so use them, otherwise define them using the default values.
Just as a tip, I’d like to point out that $XDG_DATA_DIRS and $XDG_CONFIG_DIRS specify additional directories to search for files, and $XDG_DATA_HOME and $XDG_CONFIG_HOME are inherently searched. This point could be a little confusing, I think.
- Generally system/global config is stored somewhere under /etc.
- User-specific config is stored in the user’s home directory, often as a hidden file, sometimes as a hidden directory containing non-hidden files (and possibly more subdirectories).
Generally speaking, command line options will override environment variables which will override user defaults which will override system defaults.
+1 Very simple and precise explanation. Although some setups do not place their config files in /etc but they do so in home directory only. Depends highly on the specific kind of application.
GUI apps seem to be starting to use $HOME/.config as the directory to store per-app, per-user config files. Makes the home directory much tidier and easier to backup your config.
Newer Applications
Follow XDG Base Directory Specification usually ~/.config/yourapp/* can be INF, JSON, YML or whatever format floats your boat, and whatever files. yourapp should match your executable name, or be namespaced with your organization/company/username/handle to ~/.config/yourorg/yourapp/*
Older Applications
Per-user configuration, usually right in your home directory.
- ~/.yourapp file for a single file
- ~/.yourapp/ for multiple files + data usually in ~/.yourapp/config
Global configurations are generally in /etc/appname file or /etc/appname/ directory.
Global App data: /var/lib/yourapp/
Some additional info from tutorialhelpdesk.com
The directory structure of Linux/other Unix-like systems and directory details.
In Windows, almost all programs install their files (all files) in the directory named: ‘Program Files’ Such is not the case in Linux. The directory system categorizes all installed files. All configuration files are in /etc , all binary files are in /bin or /usr/bin or /usr/local/bin . Here is the entire directory structure along with what they contain:
/ — Root directory that forms the base of the file system. All files and directories are logically contained inside the root directory regardless of their physical locations.
/bin — Contains the executable programs that are part of the Linux operating system. Many Linux commands, such as cat, cp, ls, more, and tar, are locate in /bin
/boot — Contains the Linux kernel and other files needed by LILO and GRUB boot managers.
/dev — Contains all device files. Linux treats each device as a special file. All such files are located in /dev .
/etc — Contains most system configuration files and the initialisation scripts in /etc/rc.d subdirectory.
/home — Home directory is the parent to the home directories of users.
/lib — Contains library files, including loadable driver modules needed to boot the system.
/lost+found — Directory for lost files. Every disk partition has a lost+found directory.
/media — Directory for mounting files systems on removable media like CD-ROM drives, floppy disks, and Zip drives.
/mnt — A directory for temporarily mounted filesystems.
/opt — Optional software packages copy/install files here.
/proc — A special directory in a virtual filesystem. It contains the information about various aspects of a Linux system.
/root — Home directory of the root user.
/sbin — Contains administrative binary files. Commands such as mount, shutdown, umount, reside here.
/srv — Contains data for services (HTTP, FTP, etc.) offered by the system.
/sys — A special directory that contains information about the devices, as seen by the Linux kernel.
/tmp — Temporary directory which can be used as a scratch directory (storage for temporary files). The contents of this directory are cleared each time the system boots.
/usr — Contains subdirectories for many programs such as the X Window System.
/usr/bin — Contains executable files for many Linux commands. It is not part of the core Linux operating system.
/usr/include — Contains header files for C and C++ programming languages
/usr/lib — Contains libraries for C and C++ programming languages.
/usr/local — Contains local files. It has a similar directories as /usr contains.
/usr/sbin — Contains administrative commands.
/usr/share — Contains files that are shared, like, default configuration files, images, documentation, etc.
/usr/src — Contains the source code for the Linux kernel.
/var — Contains various system files such as log, mail directories, print spool, etc. which tend to change in numbers and size over time.
/var/cache — Storage area for cached data for applications.
/var/lib — Contains information relating to the current state of applications. Programs modify this when they run.
/var/lock — Contains lock files which are checked by applications so that a resource can be used by one application only.
/var/log — Contains log files for different applications.
/var/mail — Contains users’ emails.
/var/opt — Contains variable data for packages stored in /opt directory.
/var/run — Contains data describing the system since it was booted.
/var/spool — Contains data that is waiting for some kind of processing.
/var/tmp — Contains temporary files preserved between system reboots.