Вопрос был решен. Appearently LC_ALL=C
недостаточно. Я должен записать export LC_ALL=C
чтобы быть распознанным sort
. Это - мое плохое, но должно быть известно будущими unicode-сортировщиками
POSIX мало что предлагает в плане получения информации о несвязанных процессах. На самом деле есть только ps
, и он не дает никакой информации о текущем каталоге. API-интерфейсы на C-уровне не лучше (на самом деле большая часть информации, получаемой с помощью ps
, может быть получена только путем разбора его вывода¹).
Как ни странно, но POSIX предлагает портативный путь наоборот: получив файл, вы можете узнать, какие процессы открыли его, позвонив в fuser
. Следующий сниппет перечисляет PID процессов, имеющих определенный рабочий каталог:
fuser -f "$directory_name" 2>&1 | sed -e '$!d' -e 's/.*://' -e 's/ */\
/' | sed -n 's/c$//p'
Если вам нужна информация о процессах таким образом, чтобы ее можно было переносить на практике, используйте lsof. Автор lsof проделал работу по реализации всех различных способов получения информации о различных вариантах unix.
Для случайного просмотра:
lsof -a -p "$pid" -d cwd
Для автоматического разбора:
lsof -a -p "$pid" -d cwd -F n | sed -e '1d' -e '2s/^n//'
Обратите внимание, что lsof
заменяет новые строки строкой \n
.
Некоторые варианты Unix предлагают методы, не требующие программного обеспечения сторонних разработчиков, но эти методы будут иметь силу, характерную для каждого варианта. Очень похожее замечание см. в Портативность ссылок на файловые дескрипторы
¹ Некоторые старые юникс имеют ps
корень сетуида и чтение памяти ядра, поэтому использование этого двоичного сетуида было единственным способом получения этой информации.
] У меня есть решение, использующее []lsof[
]. По умолчанию оно не установлено на BSD, поэтому, если кто-то хочет использовать его на BSD, необходимо его установить.[
]Сделайте скрипт оболочки:[
] [#!/bin/sh
lsof -p $1 | grep cwd | awk '{print $9}'
]
[]Скопируйте его в каталог по вашему пути. Он распечатает рабочую директорию PID, указанную в первом аргументе, т.е.[
] [$ script 1987
/home/enedil
] Я внесу свой вклад в ответ.
Опция, в контексте интерактивной оболочки (вопрос фокусируется на этом контексте), может автоматически поддерживать ссылку а-ля /proc/$PID/cwd
, используя возможность автоматизации Bash предоставляет:
PROMPT_COMMAND="ln -sfT \$(pwd) ~/$LINK_NAME"
Опция f
необходима, так как ссылка будет часто переопределяться. Необходима опция T
, так как в противном случае опция f
работает правильно.
Оболочка может быть сделана кооперативной, используя это в примере, ~/.bashrc
:
if [ -v CWD_LINK_NAME ]; then
PROMPT_COMMAND='ln -sfT "$(pwd)" "'$CWD_LINK_NAME'";'$PROMPT_COMMAND
declare -r CWD_LINK_NAME
function rm_cwd_link() {
rm "$CWD_LINK_NAME"
}
trap rm_cwd_link EXIT
fi
Оболочка или терминал может быть выполнен с CWD_LINK_NAME
, установленным на любое соответствующее значение. Ex. CWD_LINK_NAME="~/$SOME_ROLE_NAME" гном-терминал
Другой альтернативой является использование той же самой концепции для отслеживания рабочего каталога груши в переменной, это отслеживание основано на обоих вкладах @Gilles и @enedil:
PROMPT_COMMAND="PEAR_WD=\$(lsof -p $PID | awk '/cwd/{print \$9}')"
Однако, это менее точный и менее удобный способ, в то время как для редких случаев $PROMPT_COMMAND
не может быть установлен в другой оболочке.
Я за первый вариант (все еще жду, прежде чем выбрать ответ, если когда-нибудь появятся другие варианты).