tl;dr:Оболочки не делают этого автоматически, потому что затраты превышают вероятные выгоды.
В других ответах указывалось на техническую разницу между stdin, являющимся каналом, и файлом. Имея это в виду, снаряд может выполнить одно из:
cat
как встроенную функцию, сохранив различие между файлом и каналом. Это сэкономит затраты на exec и, возможно, на форк. Затем вы должны рассмотреть затраты и преимущества каждого подхода. Преимущества достаточно просты:
cat
)Таким образом, вы сэкономите немного процессорного времени и памяти, особенно если сможете избежать форка. Конечно, вы экономите это время и память только тогда, когда функция действительно используется. И вы действительно экономите только время fork/exec; с большими файлами время в основном является временем ввода-вывода (, т. е. чтением файла с диска ). Таким образом, вы должны спросить :, как часто cat
используется (бесполезно )в сценариях оболочки, где производительность действительно имеет значение? Сравните его с другими распространенными встроенными командами оболочки, такими как test
— трудно представить, что cat
используется (бесполезно )даже в десять раз реже, чем test
используется в важных местах. Это предположение, которое я не измерял, и это то, что вы хотели бы сделать перед любой попыткой реализации. (Или аналогичным образом попросить кого-то еще реализовать, например, запрос функции.)
Затем вы спрашиваете :, каковы затраты. Две затраты, которые приходят на ум, это ()дополнительный код в оболочке, который увеличивает его размер (и, следовательно, возможно использование памяти ), требует дополнительных работ по обслуживанию, является еще одним местом для ошибок и т. д. ; и (b )обратная совместимость удивляет, POSIX cat
опускает многие функции, например, GNU coreutils cat
, так что вы должны быть осторожны, что именно будет реализовывать встроенный cat
.
Дополнительная встроенная опция, вероятно, не так уж и плоха — добавление еще одной встроенной функции там, где уже существует множество. Если бы у вас были данные профилирования, показывающие, что это поможет, вы, вероятно, могли бы убедить авторов вашей любимой оболочки добавить ее.
Что касается анализа конвейера, я не думаю, что в настоящее время оболочки делают что-то подобное (некоторые распознают конец конвейера и могут избежать разветвления ). По сути, вы добавляете в оболочку (примитивный )оптимизатор; оптимизаторы часто оказываются сложным кодом и источником множества ошибок.И эти ошибки могут быть удивительными — небольшие изменения в сценарии оболочки могут привести к тому, что ошибка будет устранена или спровоцирована.
Постскриптум:Вы можете применить аналогичный анализ к вашему бесполезному использованию кота. Преимущества :легче читать (хотя, если command1 будет принимать файл в качестве аргумента, вероятно, нет ). Стоит :лишнее fork и exec (и если command1 может принимать файл в качестве аргумента, вероятно больше запутанных сообщений об ошибках ). Если ваш анализ говорит вам бесполезно использовать кошку, тогда вперед.
Изменения в fdisk
остаются в памяти самого fdisk
до тех пор, пока вы не скажете инструменту записать их на устройство. Вы делаете это с помощью w
. Если вы выйдете с помощью q
, изменения будут потеряны.
После записи изменений fdisk
уведомляет ОС. В современных «больших» дистрибутивах этого должно быть достаточно. Отныне lsblk
должен показывать новое состояние разделов.
Я предполагаю, что некоторые старые или ограниченные версии fdisk
могут не уведомлять ОС. В этом случае вызовитеpartprobe /dev/sdb
(или просто partprobe
).
Если partprobe
недоступен и диск является внешним (, т.е. подключен по USB ), sync
на всякий случай отключите и снова подключите. Это должно заставить ОС проверять разделы. Если вы не можете partprobe
и не можете отключить диск (, например. диск внутренний, фиксированный ), перезагрузка - окончательное решение. Менее радикальные методы могут быть доступны, а могут и отсутствовать.