Используйте /etc/paths.d
. Основная причина в том, что / etc / paths
будут изменены и / или заменены обновлениями системы. /etc/paths.d/
элементов не будет. Файлы обычно именуются шаблоном index-source
. Например, 99-mypaths
. Пути добавляются в порядке *. Намного проще просто добавить / удалить файл, чем программно редактировать его идемпотентно без ошибок.
По умолчанию csh.login
, профиль
и zprofile
в macOS все загружают path_helper
.
* Возможно, в порядке ASCII, но, возможно, в ЛОКАЛЬНОМ порядке.
Несколько замечаний по синтаксическому анализу вывода ls
:
C
ls -l
, поскольку имя пользователя и имя группы появляются перед датой и может содержать пробелы (хотя на практике это редко), вы не можете рассчитывать, что дата всегда будет в 6-м поле. Лучше использовать ls -n
, чтобы использовать числовой uid / gid (или -o
, -g
с реализациями, в которых они есть). ls -l file
перечислит его содержимое. Вам нужна опция -d
(на данный момент LC_ALL = C ls -nd - "$ file"
). если имя файла (или цель символической ссылки для файлов типа символическая ссылка) содержит символы новой строки, то вам нужно убедиться, что вы учитываете только первую строку вывода
LC_ALL = C ls -nd - "$ file" | awk '{выведите 6, 7, 8 долларов; exit} '
В локали C формат времени модификации меняется в зависимости от того, был ли файл изменен в последний раз за последние 6 месяцев или нет (или в будущем). Таким образом, вы можете получить 14 июня, 09:18
или 4 февраля 2014 г.
или 1 января 2017 г.
, если запускается 09.11.2016. Если год не указан, вы не можете считать, что год является текущим годом. Например, если вы запустите его в январе и получите Dec 24 23:59
, это декабрь прошлого года.
Это все еще можно решить следующим образом:
LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
m=$6; d=$7; y=$8
m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
if (y ~ /:/) {
split(now, a, ":")
y = a[2]
if (m > a[1]) y--
}
printf "%02d/%02d/%04d\n", d, m, y
exit}'
Но лучше всего было бы получить время в правильном формате с самого начала.С zsh
вы можете использовать его встроенную stat
:
zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file
В системе GNU вы можете сделать:
date -r "$file" +%d/%m/%Y
(хотя для символических ссылок это дает вам время модификации цель).
или:
find -- "$file" -prune -printf '%Td/%Tm/%TY\n'
на BSD:
stat -t %d/%m/%Y -f %Sm -- "$file"
Или использование perl
для переносимости:
perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"
Если вы хотите использовать ls
, вы можете сделать это : ls -l --time-style = +% d /% m /% Y