Рекурсивный вызов Bash не работает

В Linux вы можете просмотреть файловую систему / proc специально для данного PID в / proc / / fd . Здесь перечислены все файловые дескрипторы (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: [....] - это сокет.

1
10.05.2019, 17:01
2 ответа

Когда задается .bashrc, рабочая команда просто вызывается bash.

Что, в свою очередь, означает, что ./$0расширяется до

./bash

И поскольку bashне является файлом в текущем каталоге, вы получаете это сообщение об ошибке. Вы не хотите выполнять его, вы хотите получить его, поэтому между .и именем файла должен быть пробел. В противном случае .ссылается на текущий рабочий каталог.

. ~/.bashrc
0
27.01.2020, 23:41

Первая и очевидная проблема заключается в следующем:

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
}
1
27.01.2020, 23:41

Теги

Похожие вопросы