Учитывая, что ваш start-stop-daemon
имеет размер 4 ГБ и датирован 31 декабря 1969 г., я подозреваю, что ваш файловая система может быть повреждена ...
sudo touch /forcefsck
, а затем перезагрузитесь, чтобы проверить файловую систему.
Знак вопроса в выводе ls
здесь происходит из массива filetype_letter
array (в GNU ls
):
/* Display letters and indicators for each filetype.
Keep these in sync with enum filetype. */
static char const filetype_letter[] = "?pcdb-lswd";
Это соответствует C_ORPHAN
:
#define FILETYPE_INDICATORS \
{ \
C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE, \
C_LINK, C_SOCK, C_FILE, C_DIR \
}
и unknown
в filetype
enum
, и является значением по умолчанию для файла неизвестного типа :
/* Classify a file of some other type as C_ORPHAN. */
type = C_ORPHAN;
(реализации ls
могут добавлять свои собственные символы к тем , определенным POSIX .)
export VARIABLE_NAME='some value'
— способ установить переменную среды любая POSIX-совместимая оболочка (sh
, dash
, bash
, ksh
и т. д.; также zsh). Если у переменной уже есть значение, вы можете использовать export VARIABLE_NAME
, чтобы сделать ее переменной среды без изменения ее значения.
Pre-POSIX оболочки Bourne не поддерживали это, поэтому вы увидите сценарии, которые избегают export VARIABLE_NAME='some value'
и используют VARIABLE_NAME=' некоторое значение'; вместо этого экспортируйте VARIABLE_NAME
. Но оболочки Bourne до POSIX в настоящее время крайне редки.
setenv VARIABLE_NAME='некоторое значение'
— это синтаксис csh для установки переменной среды. setenv
не существует в sh, а csh крайне редко используется в скриптах и за последние 20 лет превзошел bash по интерактивному использованию (а zsh и того дольше), так что про него можно забыть разве что вы сталкиваетесь с этим.
Команда env
очень редко полезна, за исключением shebang lines.При вызове без аргументов он отображает среду, но export
делает это лучше (сортируется и часто цитируется для устранения неоднозначности новых строк в значениях от новых строк, которые разделяют значения). При вызове с аргументами он запускает команду с дополнительными переменными среды, но та же команда без env
также работает (VAR=value mycommand
запускает mycommand
с VAR
устанавливается в значение
, точно так же, как env VAR=значение mycommand
). Причина, по которой env
полезна в строке shebang, заключается в том, что она выполняет поиск PATH
и не делает ничего другого при вызове с именем команды. Команда env
может быть полезна для запуска команды только с несколькими переменными среды с -i
или без параметров для отображения среды, включая переменные с недопустимыми именами, которые не поддерживает оболочка. Импортировать.
Есть несколько вопросов с ответами на них:
Разница между экспортируемыми переменными оболочки и теми, которых нет в bash
В чем разница в использовании между переменными оболочки и переменными среды?
(и т.д.)
Установка переменной типа VAR='asdf'
оставляет среду неизменной, а это означает, что программы, которые вы запускаете в том же сеансе, ничего не знают о VAR
и не сможет получить к нему доступ. Вам нужно такое поведение при написании сценариев оболочки.
export
, с другой стороны, является встроенной функцией bash, которая изменяет среду, делая экспортируемую переменную видимой для дочерних процессов, порожденных в текущем сеансе. Вы можете добиться того же, запустив VAR='asdf' %program_name%
.
env
— это не встроенная функция, а отдельная программа. На первый взгляд это работает точно так же, как когда вы VAR='asdf' %program_name%
, но на более низком уровне все становится немного сложнее. Сначала запускается env
. Он изменяет среду, затем выполняет команду с заданными аргументами. Такого же поведения вы можете добиться в своем собственном коде, используя системный вызов exec(3).
setenv
— это просто экспорт
в оболочках семейства csh, как указано в вашем ответе.