«sudo -i» работает, но выводит сообщение «bash: n: command not found...». Почему и как устранить?
Часто использую команду sudo -i. Команда выполняет свои задачи, но несколько недель тому под ней стало появлятся сообщение bash: n: command not found. Немного раздражает, хочется разобраться в причине и устранить её.
Из-за чувствительного тачпада во время набора текста регулярно происходит перескакивание курсора ввода текста, или выделение частей текста. Есть подозрение, что в процессе редактирования каких-то файлов я таким образом допустил опечатку. В то же время я не редактировал какие-то .bashrc или .bash_profile файлы. Но все равно попробовал поверхностно заглянуть в них в надежде заметить очевидную опечатку, но тщетно.
Так же команда sudo su не выводит никаких подобных сообщений.
Подскажите в чем может крытся причина или как я могу отследить источник возникновения этого сообщения. Спасибо
Еще смотри в ~/.profile (или ~/.bash_login если его нет), /etc/profile, /etc/bash.bashrc, файлы в /etc/profile.d/
n это может быть node version manager, его удалил а в скриптах его вызов остался (зачем правда непонятно)
NVM не ставил, пару дней назад установил поэкспериментировать альтернативу Volta.
Имели ввиду ~/.bash_logout?
Bash-скрипты я довольно приблизительно понимаю и могу легко пропустить ошибку. Заглянул в перечисленные файлы и ничего явного на глаза не попалось. Есть еще какие-то варианты? Возможно мне стоит запостить содержание всех этих файлов?
Не надо, но у меня совет значительно сократить количество мест для исследований - повторяется ли ошибка под другим пользователем (можно специально его создать ради эксперимента и тут же удалить). Если повторяется - значит проблема глобальная, и искать в /etc а если нет то локально пользовательская и искать только в скриптах /home/...
еще совет, попробуй помониторь все файлы, открываемые sudo -i -u твой_пользователь с помощью strace https://habr.com/ru/articles/92123/ уж точно не пропустишь файл
можно будет выделить список файлов из полученного лога и скормить их file, отфильтровать по типу bash script или text, тогда будет проще
1. Проблема глобальная
2. Я долго не мог разобраться со strace. Даже пример с nano test.txt не выводил ничего кроме exited with 0. Похоже вместо eopen правильно вводить eopenat и тогда пример сработал.
3. Для nano test.txt в логе действительно много файлов типа
Antowa Kartowa, strace надо гонять с ключом -f, чтобы он дочерние процессы тоже изучал.
Но как пить дать это ~/.bash_profile, ~/.bashrc, ~/.profile, /etc/profile, /etc/bashrc или какие-то скрипты из них вызываемые... Причём в хоуме root искать.
Кстати, советую сравнить sudo -i и sudo -s. Если есть разница, то больше похоже что это в ...profile, чем в ...rc.
shurshur, по той ссылке, что дал rPman примеры описаны как раз с ключем -f, да и когда не получилось с первого раза стал вчитываться и разбирать все опции тулы. Так что этот флаг я везде использовал.
В общем пошел старым проверенным способом - отсекать и проверять. Посмотрел порядок загрузки конфигурационных файлов и начал с конца все в файле комментировать и в новой вкладке терминала проверять изменилось ли что-то.
Источником сообщения оказался /etc/profile а именно вот эта часть почти в самом конце файла:
# Source global bash config, when interactive but not posix or sh mode
if test "$BASH" &&\n test -z "$POSIXLY_CORRECT" &&\n test "${0#-}" != sh &&\n test -r /etc/bashrc
then
# Bash login shells run only /etc/profile
# Bash non-login shells run only /etc/bashrc
# Check for double sourcing is done in /etc/bashrc.
. /etc/bashrc
fi
Я не совсем понимаю как символы переноса строки \n работают за пределами строки в самом скрипте, но попробовал просто заменить их буквальным переносом. Это ничего сломать не должно? Сообщение в таком варианте не выводится.
# Source global bash config, when interactive but not posix or sh mode
if test "$BASH" &&
test -z "$POSIXLY_CORRECT" &&
test "${0#-}" != sh &&
test -r /etc/bashrc
then
# Bash login shells run only /etc/profile
# Bash non-login shells run only /etc/bashrc
# Check for double sourcing is done in /etc/bashrc.
. /etc/bashrc
fi
Antowa Kartowa, скорее всего, этот кусок добавлен скриптом, который делал что-то типа echo "aaa\nbbb", а нюанс в том, что в echo требует ключа -e, чтобы \-коды работали.