Таким образом, строго говоря, на вопрос, почему они это делают, ответить невозможно, поскольку в качестве предпосылки он принимает ложь.
Они показывают столбцы 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
не используют имена столбцов, используемые в командной строке, в заголовках столбцов, указанных в их выходных данных. Таким образом, часто нельзя определить только по заголовку столбца, какой столбец на самом деле отображается.
ps
помечает столбец имени учета либо UCOMM
, либо COMMAND
, но также помечает столбец строк аргументов COMMAND
. ps
помечает столбец строк аргументов как CMD
или COMMAND
, но также помечает столбец имени учета как CMD
или COMMAND
. (Для сравнения s6-ps
Лорана Берко содержит только comm
, args
и env
с фиксированными и отдельными метками заголовков COMM
, COMMAND
и ENVIRONMENT
, что дает только первый три из четырех порций информации из ядра напрямую, без их объединения.)
s6-ps
. s6 -linux -утилиты . Программное обеспечение. Посмотрите, будет ли это работать с hostname.txt. Возможно, wc -l
уменьшает количество строк на единицу или что-то в этом роде.
for f in $(cat hostnames.txt); do ping -c 3 ${f}; done
@steeldriver в комментариях ответил на это :«невидимые» окончания строк CRLF вызвали эту проблему, и теперь, когда я знаю, я могу использовать многочисленные обходные пути для решения этой проблемы. Кроме того, спасибо всем остальным в комментариях за помощь в улучшении моего кода! Хотя я не совсем новичок в BASH, мне еще многое предстоит узнать!