Различные сообщения об ошибках при использовании различных строк в терминале

chattr утилита записана для ext2/ext3/ext4 файловых систем. Это испускает ioctls на файлах, таким образом, это до базовой файловой системы для решения, что сделать с ними. Драйвер XFS в более новых ядрах Linux поддерживает то же FS_IOC_SETFLAGS ioctl как расширение [234] для управления флагами, такими как только добавление но можно ли выполнять более старое ядро, где это не делает (CentOS?). Попытайтесь использовать xfs_io утилита вместо этого:

echo chattr +a | xfs_io test.log

Обратите внимание, что, для XFS как для расширения [234], только корень может изменить флаг только добавления (более точно, Вам нужно CAP_LINUX_IMMUTABLE возможность).

2
27.04.2016, 21:36
2 ответа

Равно как и ewhac указал, сообщения об ошибках отличаются, потому что последняя командная строка содержит наклонные черты вправо (/), который заставляет Вашу оболочку интерпретировать его как путь к файлу.

Обе ошибки происходят из Вашей оболочки, которая в этом случае является bash (который очевиден из второго сообщения об ошибке).

Строго говоря, первая ошибка происходит из execute_disk_command() функция, определяемая в execute_command.c в bash-4.2 исходный код. execute_disk_command() вызовы функции search_for_command() определенный в findcmd.c, который, в случае, если указанное pathname не содержит наклонные черты вправо, поиски $PATH для pathname. В случае, если pathname содержит наклонные черты вправо, search_for_command() не выполняет этот поиск. В случае, если search_for_command() не возвращает команду, execute_disk_command() перестанет работать с command not found внутренняя ошибка.

Вторая ошибка происходит из shell_execve() функция, также определенная в execute_command.c. В этой точке в Вашем сценарии,search_for_command() возвратился бы успешно, потому что не будет никакого поиска, необходимого, и execute_disk_command() звонил shell_execve(), который в свою очередь работает execve() системный вызов. Это перестало работать, потому что файл execve() попытки выполниться не существуют, и execve() указывает на это путем установки errno соответственно. Когда execve() сбои, shell_execve() использование strerror() сообщить о соответствующем сообщении об ошибке файла (No such file or directory) и сразу выходит из оболочки на ошибке.

2
27.01.2020, 22:01
  • 1
    Потрясающий, это - то, что я хотел знать. Теперь я думаю, что могу отредактировать исходный код удара и сделать URL, который будет открыт от терминала только путем введения его имени. –  Radu Rădeanu 25.10.2013, 11:23

/ символ является разделителем пути. Оболочка поэтому предполагает определение относительного пути к названной команде unix.stackexchange.com в соответствии с названным каталогом http:. Оболочка не удается найти каталог или файл, и говорит так. Вы получили бы то же сообщение об ошибке, если бы Вы попытались выполнить команду, названную (например): foo/bar/grill/snorklewacker.

С другой стороны, при вводе пустого названия команды без разделителя пути затем оболочка регистрирует список каталогов PATH переменная среды, в порядке, в котором они появляются, чтобы видеть, содержат ли они программу. Таким образом, если необходимо было войти unix.stackexchange.com при подсказке в моей системе оболочка провела бы поисковый поиск:

  • /usr/local/bin/unix.stackexchange.com
  • /usr/bin/unix.stackexchange.com
  • /bin/unix.stackexchange.com
  • /usr/local/games/unix.stackexchange.com
  • /usr/games/unix.stackexchange.com

Если все те поиски перестали работать, то Вы получаете ошибку command not found.

2
27.01.2020, 22:01

Теги

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