Ошибка со сценарием bash после переноса одного текстового файла в другой

Нет.

Таким образом, строго говоря, на вопрос, почему они это делают, ответить невозможно, поскольку в качестве предпосылки он принимает ложь.

Они показывают столбцы cmdи ucmd, два разных фрагмента информации. К сожалению, и программа GNU ps, и программа FreeBSD psвносят здесь путаницу.

Ядра, такие как Linux и ядра BSD, предоставляют четыре (релевантных )фрагмента информации о процессе через файлы в /procиsysctl():

  • короткое имя образа программы, также известное как короткое имя, используемое для учета процессов;
  • его строки аргументов, инициализированные execve()и изменяемые во время выполнения;
  • его строки окружения, инициализированные execve()и изменяемые во время выполнения; и
  • полный путь к исполняемому файлу образа программы.

Строки аргументов и строки окружения можно изменять во время выполнения способами, описанными вhttps://unix.stackexchange.com/a/438007/5132и https://unix.stackexchange.com/a/432681/5132. Linux также позволяет изменять имя учета процесса.

GNU Screen изменил строки своих аргументов, так что первая из них читается как «SCREEN», а не имя учета процесса, которое осталось как «экран».

В psесть только два столбца для отображения этих четырех частей информации. В FreeBSD psстолбцы содержат эту информацию следующим образом:

  • Столбец с именами commandи argsсодержит строки аргументов, а также строки среды, если используется параметр e, а также имя учета в квадратных скобках, если оно не соответствует первой из строк аргументов. ; все с префиксом древовидной диаграммы, если используется опция dи это последний столбец.
  • Столбец с именами ucommи commсодержит учетное имя процесса.

GNU psдобавляет cmdв качестве псевдонима для первого и ucmdв качестве псевдонима для второго. Он помещает древовидную диаграмму и строки среды в оба столбца и всегда помещает древовидную диаграмму, даже если столбец , а не последний столбец.

В GNU psпараметр -f(, который не следует путать с параметром f-Afв вопросе, является просто сокращением для указания другого набора столбцов для psдля печати. Набор столбцов по умолчанию включает ucmd. Набор, используемый при использовании опции -f, вместо этого включает cmd.

Руководство для BSD psизлагает это явно, давая точные столбцы, выбранные его сокращениями -j, -l, -uи -v. В руководстве для GNU psупоминаются «полный формат», «формат заданий», «длинный формат» и «пользовательский формат», но явно не указывается, к какому набору столбцов относится каждый из них.

Чтобы еще больше запутать,и GNU ps, и FreeBSD psне используют имена столбцов, используемые в командной строке, в заголовках столбцов, указанных в их выходных данных. Таким образом, часто нельзя определить только по заголовку столбца, какой столбец на самом деле отображается.

  • FreeBSD psпомечает столбец имени учета либо UCOMM, либо COMMAND, но также помечает столбец строк аргументов COMMAND.
  • GNU psпомечает столбец строк аргументов как CMDили COMMAND, но также помечает столбец имени учета как CMDили COMMAND.

(Для сравнения s6-psЛорана Берко содержит только comm, argsи envс фиксированными и отдельными метками заголовков COMM, COMMANDи ENVIRONMENT, что дает только первый три из четырех порций информации из ядра напрямую, без их объединения.)

  • Лоран Берко (2014 ).s6-ps. s6 -linux -утилиты . Программное обеспечение.

1
02.03.2021, 12:12
2 ответа

Посмотрите, будет ли это работать с hostname.txt. Возможно, wc -lуменьшает количество строк на единицу или что-то в этом роде.

for f in $(cat hostnames.txt); do ping -c 3 ${f}; done
0
18.03.2021, 22:27

@steeldriver в комментариях ответил на это :«невидимые» окончания строк CRLF вызвали эту проблему, и теперь, когда я знаю, я могу использовать многочисленные обходные пути для решения этой проблемы. Кроме того, спасибо всем остальным в комментариях за помощь в улучшении моего кода! Хотя я не совсем новичок в BASH, мне еще многое предстоит узнать!

1
18.03.2021, 22:27

Теги

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