Depende de la disponibilidad de los expedientes y del orden de su ejecución. Cada vez que abre un nuevo shell, se lee el archivo ~/.bashrc. El archivo ~/.profile solo se lee cuando el usuario inicia sesión, pero no cuando el usuario inicia un nuevo shell. Entonces, ya sea que establezca la ruta en el archivo ~/.bashrc o en el archivo ~/.profile, no habrá mucha diferencia. Una buena práctica es configurarlo en el archivo ~/.bashrc. Además, el archivo ~/.profile se lee solo cuando el inicio de sesión ~/.bash _o los archivos de perfil ~/.bash _no están disponibles.
С инструментами GNU:
#! /bin/bash -
export LC_ALL=C
eval "files=($(ls -dt --quoting-style=shell-always -- "${@?}"))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Для символических ссылок будет учитываться время последней модификации самой символической ссылки. Если вы предпочитаете, чтобы это была цель символической ссылки, добавьте параметр -L
к ls
.
Если вы хотите добавить ограничение на то, что пути к файлам, указанные в качестве аргумента, не могут содержать символы новой строки, вы можете написать:
#! /bin/sh -
# only works for file paths that don't contain newline characters
[ "$#" -gt 0 ] && ls -td -- "$@" | head -n 1
и удалить зависимость от инструментов GNU.
Принцип тот же: используйте способность ls -t
сортировать файлы по времени модификации и получить первый в этом списке. Но здесь ls
выводит список файлов по одному в каждой строке, что делает невозможным надежный анализ, если вы не можете гарантировать, что ни один из путей к файлам не будет содержать символы новой строки (в противном случае вы не сможете укажите разницу между файлом с именем a
и двумя файлами a
и b
и если a
был самый новый файл, head -n 1
будет отображать только a
, что даст неверный результат).
По сравнению с вашим подходом здесь мы передаем список аргументов, полученных сценарием ("$@"
), в ls
(после --
, чтобы эти аргументы обрабатывались ls
как файловые операнды, а не параметры) и передавая -d
, чтобы ls
не перечислял содержимое тех файлов, которые имеют тип каталог. Мы также не делаем этого, если скрипт получил 0 аргументов ($#
== 0), иначе ls -td --
выведет текущий каталог, так что вы получить .
в качестве вывода.
Вместо GNU ls
вы также можете использовать GNU stat
для получения времени модификации файла таким образом, чтобы его можно было отсортировать с помощью GNU sort
:
#! /bin/sh -
export TZ=UTC0 LC_ALL=C
stat --printf '%y@%n\0' -- "$@" | sort -rz | sed -z 's/^[^@]*@//;q' | tr '\0' '\n'
(с последней версией GNU sed
для -z
). Или используя GNU awk
:
#! /bin/sh -
export TZ=UTC0 LC_ALL=C
stat --printf '%y@%n\0' -- "$@" | awk -v RS='\0' '
NR == 1 || $0 > newest {newest = $0}
END {if (NR) {sub(/[^@]*@/, "", newest); print newest}}'