Короче говоря, потому что выполнить бит считают особенным; если это не установлено вообще, то файл считается не исполняемым файлом и таким образом не может быть выполнен.
Однако, если даже ОДИН из выполнить битов установлен, корень может и выполнять его.
Наблюдайте:
caleburn: ~/ >cat hello.sh
#!/bin/sh
echo "Hello!"
caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh
sudo: ./hello.sh: command not found
caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh
Hello!
sort | uniq
существовавший прежде sort -u
, и совместимо с более широким диапазоном систем, хотя почти все современные системы действительно поддерживают -u
- это - POSIX. Это - главным образом возврат ко дням когда sort -u
не существовал (и люди не склонны изменять свои методы, если способ, которым они знают, продолжает работать, просто посмотрите на ifconfig
по сравнению с. ip
принятие).
Эти два были, вероятно, объединены, потому что удаление дубликатов в файле требует сортировки (по крайней мере, в стандартном случае), и является случаем чрезвычайно общего использования вида. Это также быстрее внутренне в результате способности сделать обе операции одновременно (и вследствие того, что это не требует IPC между uniq
и sort
). Особенно, если файл является большим, sort -u
будет, вероятно, использовать меньше промежуточных файлов для сортировки данных.
В моей системе я последовательно получаю результаты как это:
$ dd if=/dev/urandom of=/dev/shm/file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 8.95208 s, 11.7 MB/s
$ time sort -u /dev/shm/file >/dev/null
real 0m0.500s
user 0m0.767s
sys 0m0.167s
$ time sort /dev/shm/file | uniq >/dev/null
real 0m0.772s
user 0m1.137s
sys 0m0.273s
Это также не маскирует код возврата sort
, который может быть важным (в современных оболочках существуют способы получить это, например, bash
$PIPESTATUS
массив, но это было не всегда верно).
Одно различие - это uniq
имеет много полезных дополнительных опций, таких как пропуск полей для сравнения и подсчета количества повторений значения. sort
-u
отметьте только реализует функциональность неукрашенного uniq
команда.
sort -u
не может быть передан uniq
использовать некоторые полезные опции последнего, такие как пропуск полей для сравнения и подсчета количества повторений".
– l0b0
16.05.2013, 17:10
С совместимым POSIX sort
s и uniq
s (GNU uniq
в настоящее время не совместимо в том отношении), существует различие в этом sort
использует алгоритм сопоставления локали для сравнения, строки (будет обычно использовать strcoll()
сравнить строки) в то время как uniq
проверки на идентификационные данные значения байта (будет обычно использовать strcmp()
) ¹.
Это имеет значение по крайней мере по двум причинам.
В некоторых локалях, особенно в системах GNU, существуют различные символы тот вид то же. Например, в en_US.UTF-8 локали в системе GNU, весь ①②③④⑤⑥⑦⑧⑨⑩... символы ² и многие другие сортируют то же, потому что их порядок сортировки не определяется. 0 123 456 789 арабских цифр сортируют то же как свои Восточные арабские относящиеся к Индии дубликаты (٠١٢٣٤٥٦٧٨٩).
Для sort -u
, ① сортирует то же как ② и 0123 то же как ٠١٢٣ так sort -u
сохранил бы только одного из каждого, в то время как для uniq
(не GNU uniq
который использует strcoll()
(кроме с -i
)), ① отличается от ② и 0123 различных от ٠١٢٣, таким образом, uniq
считал бы все 4 уникальными.
strcoll
может только сравнить строки допустимых символов (поведение не определено согласно POSIX, когда вход имеет последовательности байтов, которые не формируют допустимые символы), в то время как strcmp()
не заботится о символах, так как это только делает сравнение от байта к байту. Таким образом, это - другая причина почему sort -u
может не дать Вам все уникальные строки, если некоторые из них не формируют действительный текст. sort|uniq
, в то время как все еще неуказанный на невводе текста, на практике, более вероятно, даст Вам уникальные строки по этой причине.Около той тонкости одна вещь, которая не была отмечена до сих пор, является этим uniq
сравнивает целую строку лексически, в то время как sort
-u
выдерживает сравнение на основе спецификации вида, данной на командной строке.
$ printf '%s\n' 'a b' 'a c' | sort -uk 1,1
a b
$ printf '%s\n' 'a b' 'a c' | sort -k 1,1 | uniq
a b
a c
$ printf '%s\n' 0 -0 +0 00 '' | sort -n | uniq
0
-0
+0
00
$ printf '%s\n' 0 -0 +0 00 '' | sort -nu
0
¹ Предыдущие версии спецификации POSIX вызывали беспорядок однако путем списка LC_COLLATE
переменная как одно влияние uniq
, это было удалено в выпуске 2018 года и поведении, разъясненном после того упомянутого выше обсуждения. Посмотрите соответствующую ошибку группы Остина
² редактирование 2019 года. Они были с тех пор зафиксированы, но более чем 95% кодовых точек Unicode все еще имеют неопределенный порядок с версии 2.30 GNU libc. Можно протестировать с вместо этого, например, в более новых версиях
Протокол telnet, описанный в RFC 854 , включает способ отправки внутриполосных команд, состоящий из символа IAC , '\255 '
, за которым следует еще несколько байтов. Эти команды могут выполнять такие действия, как отправка прерывания на пульт дистанционного управления, но обычно они используются для отправки опций .
Подробное описание коммутатора, отправляющего опцию terminal type , можно найти в Microsoft Q231866 .
Опция размера окна описана в RFC 1073 . Клиент сначала отправляет свое желание отправить опцию NAWS
. Если сервер отвечает DO NAWS
, клиент может отправить данные опции NAWS
, которые состоят из двух 16-битных значений.
Пример сеанса на терминале 47 row 80 column:
telnet> set options
Will show option processing.
telnet> open localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SENT WILL NAWS
RCVD DO NAWS
SENT IAC SB NAWS 0 80 (80) 0 47 (47)
протокол ssh описан в RFC 4254 . Он состоит из потока сообщений. Одним из таких сообщений является «pty-req»
, которое запрашивает псевдотерминал, и его параметры включают высоту и ширину терминала.
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string "pty-req"
boolean want_reply
string TERM environment variable value (e.g., vt100)
uint32 terminal width, characters (e.g., 80)
uint32 terminal height, rows (e.g., 24)
uint32 terminal width, pixels (e.g., 640)
uint32 terminal height, pixels (e.g., 480)
string encoded terminal modes
Клиенты telnet и ssh перехватят сигнал SIGWINCH
, поэтому при изменении размера окна терминала во время сеанса они отправят соответствующее сообщение на сервер с новым размером. Ssh отправляет сообщение об изменении размера окна:
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string "window-change"
boolean FALSE
uint32 terminal width, columns
uint32 terminal height, rows
uint32 terminal width, pixels
uint32 terminal height, pixels
-121--28854- "Если оно работает как клавиатура и имеет тип клавиатуры, оно должно быть клавиатура. "
Это не всегда так. Утилита lsusb
извлекает информацию из файла /var/lib/usbutils/usb.ids
для поиска идентификаторов поставщиков, идентификаторов продуктов, классов, подклассов и протоколов. Однако обратите внимание, что USB-устройство может имитировать неверный идентификатор (см., например, Rubber Ducky ).
Однако мне нравится опция -t
для получения дополнительной информации о подключенных устройствах. Например, USB-мышь будет выглядеть следующим образом:
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
|__ Port 1: Dev 2, If 0, Class=HID, Driver=usbhid, 1.5M
Интересная часть в Driver = usbhid
, где можно узнать, какой драйвер использует ядро для данного устройства. Классом устройства является HID, что означает устройство человека . В этом случае простая запись lsusb
будет выглядеть следующим образом:
Bus 006 Device 002: ID 046d:c050 Logitech, Inc. RX 250 Optical Mouse
046d
является идентификатором поставщика, указанным как Logitech, Inc.
, и c050
является идентификатором продукта, указанным как RX 250 Оптическая мышь
.
Можно grep
id-file для проверки этих идентификаторов:
$ grep -P "^046d|c050" /var/lib/usbutils/usb.ids
046d Logitech, Inc.
c050 RX 250 Optical Mouse
-121--108385- Я предпочитаю использовать sort | uniq
, потому что когда я пытаюсь использовать опцию -u
(устранить дубликаты) для удаления дубликатов, связанных со смешанными последовательностями вариантов, не так просто понять результат.
Примечание. Прежде чем запустить приведенные ниже примеры, необходимо смоделировать стандартную последовательность сортировки C, выполнив следующие действия:
LC_ALL=C
export LC_ALL
Например, если я хочу отсортировать файл и удалить дубликаты, одновременно сохраняя различные случаи последовательностей.
$ cat short #file to sort
Pear
Pear
apple
pear
Apple
$ sort short #normal sort (in normal C collating sequence)
Apple #the lower case words are at the end
Pear
Pear
apple
pear
$ sort -f short #correctly sorts ignoring the C collating order
Apple #but duplicates are still there
apple
Pear
Pear
pear
$ sort -fu short #By adding the -u option to remove duplicates it is
apple #difficult to ascertain the logic that sort uses to remove
Pear #duplicates(i.e., why did it remove pear instead of Pear?)
Эта путаница решается путем отказа от использования опции -u
для удаления дубликатов. Использование uniq
более предсказуемо. Ниже сначала сортируется и игнорируется регистр, а затем передается в uniq
для удаления дубликатов.
$ sort -f short | uniq
Apple
apple
Pear
pear
Еще одно различие, которое я обнаружил сегодня, - это сортировка на основе разделителя, где sort -u
применяет уникальный флаг только к столбцу, по которому выполняется сортировка.
$ cat input.csv
3,World,1
1,Hello,1
2,Hello,1
$ cat input.csv | sort -t',' -k2 -u
1,Hello,1
3,World,1
$ cat input.csv | sort -t',' -k2 | uniq
1,Hello,1
2,Hello,1
3,World,1
sort | uniq
потому что 9 раз из 10, я на самом деле передаю по каналу кuniq -c
. – Plutor 16.05.2013, 17:16sort -u
была часть 7-го Выпуска UNIX, приблизительно 1979. Версииsort
без поддержки-u
действительно архаичны — или были записаны без внимания к фактическому стандарту перед стандартом де-юре POSIX. См. также Вид Переполнения стека и uniq в оболочке Linux с 2010. – Jonathan Leffler 18.02.2015, 18:34ip
. Это - 2016 и это сообщение в 2013, но я только знаю оip
управляйте теперь. – dieend 27.05.2016, 05:22uniq -c
"(и возможно передающий по каналу еще раз кsort -nr | head
). Я задавался вопросом, к чему эквивалентsort | uniq
в Vim, когда я узнал, что Vim имеет:sort u
команда. И СЕЗАМsort -u
существует также. – Zhuoyun Wei 13.10.2017, 10:09sort -n | uniq
по сравнению с.sort -n -u
. Например, запаздывание и ведущие пробелы будет рассматриваться как дубликатыsort -n -u
но не первым!echo -e 'test \n test' | sort -n -u
возвратыtest
, ноecho -e 'test \n test' | sort -n | uniq
возвраты обе строки. – mxmlnkn 11.01.2018, 01:05