В Linux вы можете просмотреть файловую систему / proc
специально для данного PID в / proc /
. Здесь перечислены все файловые дескрипторы (fd) для каждого процесса.
$ ls -l /proc/27634/fd/
total 0
lrwx------ 1 root root 64 Mar 17 20:09 0 -> /dev/null
lrwx------ 1 root root 64 Mar 17 20:09 1 -> /dev/null
lrwx------ 1 root root 64 Mar 17 20:10 10 -> /dev/ptmx
lrwx------ 1 root root 64 Mar 17 20:10 12 -> /dev/ptmx
lrwx------ 1 root root 64 Mar 17 20:10 13 -> /dev/ptmx
lrwx------ 1 root root 64 Mar 17 20:09 2 -> /dev/null
lr-x------ 1 root root 64 Mar 17 20:09 3 -> socket:[430396]
l-wx------ 1 root root 64 Mar 17 20:09 4 -> socket:[430437]
lrwx------ 1 root root 64 Mar 17 20:09 5 -> pipe:[430440]
l-wx------ 1 root root 64 Mar 17 20:10 6 -> pipe:[430440]
lrwx------ 1 root root 64 Mar 17 20:10 7 -> socket:[430443]
lrwx------ 1 root root 64 Mar 17 20:10 8 -> socket:[430444]
lrwx------ 1 root root 64 Mar 17 20:10 9 -> socket:[430446]
Все, что указано там как socket: [....]
- это сокет.
Когда задается .bashrc
, рабочая команда просто вызывается bash
.
Что, в свою очередь, означает, что ./$0
расширяется до
./bash
И поскольку bash
не является файлом в текущем каталоге, вы получаете это сообщение об ошибке. Вы не хотите выполнять его, вы хотите получить его, поэтому между .
и именем файла должен быть пробел. В противном случае .
ссылается на текущий рабочий каталог.
. ~/.bashrc
Первая и очевидная проблема заключается в следующем:
if [ -z "EXISTS" ]; then
Это будет всегда истинным, так как вы проверяете, пуста ли строка EXISTS
. Поскольку это строка, она никогда не будет пустой. Вместо этого вы хотите сделать это:
if [ -z "$EXISTS" ]; then
Кроме того, использование ls
для подобных вещей является плохой практикой, а также использование ЗАГЛАВНЫХ БУКВ для имен переменных сценария. Используйте только заглавные буквы для переменных среды, чтобы вы могли быть уверены, что имена не будут перекрываться.
Следующая важная проблема заключается в том, что вы звоните ./$0
. $0
— это bash
, поэтому ./$0
— это ./bash
, которого не существует. Предположительно, вы хотите пере-прочитать .bashrc
.
Тогда, конечно, ваша sed
команда (даже после исправления синтаксической ошибки )всегда будет совпадать сама с собой. Вам нужно убедиться, что вы пропускаете строку с фактической командой sed, например, сопоставляя только в начале строки (также обратите внимание на исправления):
sed -i "/^export BRANCH=/{s/export BRANCH=.*$/export BRANCH="$1\"/}" ~/.bashrc
Но можно упростить до:
sed -i "s/^export BRANCH=.*$/export BRANCH="$1\"/" ~/.bashrc
Собрав это вместе, вы, вероятно, захотите что-то вроде:
switch() {
shopt -s nullglob
exists=(~/br/*"$1")
if [ -z "$exists" ]; then
## Are you sure you want the * there? That will expand to all
## files and directories beginning with $1
BR="$1*"
export PS1="...."
else
# Find "export BRANCH"a"
sed -i "s/export BRANCH=.*$/export BRANCH=\"$1\"/" ~/.bashrc
. ~/.bashrc
fi
}