show data_directory

result (example from Windows): “C:/Program Files/PostgreSQL/9.4/data”

Can be used in Linux bash script this way:

datadir=$(psql -U postgres -t -c "show data_directory")

But sometimes things are not so easy – if you do not have superuser user for PostgreSQL. Then you can try this small script:

#!/bin/bash

pgprocess="bin/postgres"

# try to find pg data directory with query - does not work for nosuperusers
pgdatadir=$(psql -U ...your_pg_user... -d postgres -t -c "select setting from pg_settings where name = 'data_directory'" 2>/dev/null)

# if query did not find value let's try process list
if [ "$pgdatadir" == "" ]; then
	# first we try to find "-D" part of postgres process
	pgdatadir=$(ps -eo cmd|grep ${pgprocess}|grep -v grep|awk '{split($0,array," -D ")} END{print array[2]}'|cut -d' ' -f1)
fi

if [ "$pgdatadir" == "" ]; then
	# if still nothing let's try config file
	pgconfig=$(ps -eo cmd|grep ${pgprocess}|grep -v grep|awk '{split($0,array,"config_file=")} END{print array[2]}'|xargs)
	if [ "$pgconfig" != "" ]; then
		pgdatadir=$(sudo cat ${pgconfig}|grep data_directory|cut -d'#' -f1|cut -d'=' -f2|tr -s ' '|xargs)
	fi
fi

if [ "$pgdatadir" == "" ]; then
	echo "ERROR: cannot find pg data directory"
	exit 1
fi