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
возможность).
Равно как и 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
) и сразу выходит из оболочки на ошибке.
/
символ является разделителем пути. Оболочка поэтому предполагает определение относительного пути к названной команде unix.stackexchange.com
в соответствии с названным каталогом http:
. Оболочка не удается найти каталог или файл, и говорит так. Вы получили бы то же сообщение об ошибке, если бы Вы попытались выполнить команду, названную (например): foo/bar/grill/snorklewacker
.
С другой стороны, при вводе пустого названия команды без разделителя пути затем оболочка регистрирует список каталогов PATH
переменная среды, в порядке, в котором они появляются, чтобы видеть, содержат ли они программу. Таким образом, если необходимо было войти unix.stackexchange.com
при подсказке в моей системе оболочка провела бы поисковый поиск:
Если все те поиски перестали работать, то Вы получаете ошибку command not found
.