Как я могу отследить сценарий, который дает мне сообщение «команда не найдена» сразу после входа в систему?

Вы можете использовать команды sort и uniq -c для подсчета вхождений всех строк, например, так:

$ sort sample.txt | uniq -c
      4 cat
      5 dog
      1 fly
      2 spider

Если вам нужна только одна строка "dog", вы можете использовать grep до или после.

after

$ sort sample.txt | uniq -c | grep dog
      5 dog

before

$ grep dog sample.txt  | uniq -c
      5 dog

Как это работает

Команда uniq -c подсчитает все уникальные строки, которые ей представлены, но сначала список должен быть отсортирован. Поэтому перед подсчетом мы используем команду sort.

Команда grep предназначена для выделения в выводе того, что представляет интерес. Вы можете рассматривать grep как фильтр, который может действовать как включительно, так и исключительно, в зависимости от того, что вы хотите получить на выходе.

Команда sort позволяет сортировать данные на основе правил. В данном случае мы позволяем ей вести себя в режиме по умолчанию, поэтому она сортирует данные на основе буквенно-цифрового набора правил сортировки.

8
16.03.2019, 14:42
4 ответа

Другой метод заключается в том, чтобы взять все упомянутые сценарии запуска и вывести строку, идентифицирующую каждый из них, в начале каждого из них.

$ head.bashrc
echo "Running bashrc"

Затем при входе в систему вы увидите что-то вроде этого:

running bashrc
running bash_aliases
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found 
running something_else

В этот момент вы можете сделать вывод, что (в приведенном выше примере).bash_aliasesсодержит оскорбительные окончания строк.

Если вы идентифицировали файл, но проблемные строки не бросаются в глаза, вы можете использовать тот же метод, чтобы отследить строку. Повторить сообщение через половину файла, затем через 3/4 или 1/4, в зависимости от вывода. Таким образом, вы можете отследить линию, в зависимости от того, отдается ли она эхом до или после вашего эха.

3
27.01.2020, 20:08

файл (1 )также может быть полезен здесь.

$file *

signin:                                     Python script, ASCII text
signup:                                     Python script, ASCII text, with CRLF line terminators
site_off.htm:                               XML 1.0 document, ASCII text
sitemaps:                                   directory

Я вижу, что signupнужно удалить эти надоедливые окончания строки Windows CRLF -.

Для рекурсии, подобной /home/username, вы, вероятно, могли бы комбинировать с findиxargs(и, возможно, с grep тоже):

$ find. | xargs file | grep CR

./foo_data/V: ASCII text, with CR, LF line terminators
./foo_data/Y: ASCII text, with CR, LF line terminators
5
27.01.2020, 20:08

Я считаю, что сложная часть этого вопроса состоит не в том, "как я могу найти возврат каретки в файле?" но «как я могу узнать, какие файлы использует мой bashrc?»

Что касается второго вопроса, вы можете попробовать что-то вроде этого:

bash -x.bashrc

Это покажет вам все, что делает ваш bashrc, включая все файлы, на которые он ссылается. Это шумно, но должно помочь вам отследить, какие файлы используются.

За исключением того, что мои (и многие другие).bashrcфайлы закрываются раньше, если они не запускаются в интерактивном режиме, поэтому вам нужно обмануть его, чтобы пройти эту проверку:

bash -ix.bashrc

Здесь -iвключает интерактивный режим.

Чтобы выделить только те случаи, когда вы исходите из файла, что-то вроде этого работает для меня, но я не могу обещать, что регулярное выражение поймает все:

bash -ix.bashrc 2> >(grep -E '^\+* (\.|source)')

Думаю, вам также могут понадобиться сообщения об ошибках, например:

bash -ix.bashrc 2> >(grep -E -e '^\+* (\.|source)' -e 'command not found')

Если по какой-то причине ничего из этого не сработало, я бы прибегнул к strace -e open bashили что-то в этом роде, чтобы найти каждый раз, когда какой-либо файл открывается вашим сеансом bash. Но это еще более тяжелое/шумное решение.

3
27.01.2020, 20:08

Bash читает несколько разных файлов при запуске, даже в зависимости от того, как он запущен(см. описание в руководстве). Кроме того, есть такие вещи, как /etc/profile.d/, которые не читаются оболочкой напрямую, но на них можно ссылаться из других файлов запуска во многих дистрибутивах.

Вам придется пройти через все это, но, к счастью, вы можете grepтолько для возврата каретки. Попробуйте, например. что-то вроде:

grep $'\r' ~/.bashrc ~/.profile ~/.bash_login ~/.bash_profile /etc/bash.bashrc /etc/profile /etc/profile.d/*

См. также Можно ли узнать, какие файлы устанавливаются/добавляются в переменные окружения, и их порядок приоритета? по аналогичной проблеме.

14
27.01.2020, 20:08

Теги

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