Комбинация echo
и xargs
здесь довольно любопытны.
basename
принимает путь в командной строке и выводит его последний компонент (то есть, как правило, часть после последней косой черты). xargs
просто помещает здесь слова, прочитанные со своего входа (конвейера), в командную строку basename
. Так почему бы просто не использовать basename $ 1
?
Однако есть разница.
В эхо 1 $ | xargs -n 1 basename
, если параметр $ 1
содержит пробелы, xargs
разделит его на пробелы и вызовет basename
для каждого слова отдельно. Конечным результатом будет то, что часть имени файла будет выбрана для всех слов, как показал Арминий .
Другой вариант, basename $ 1
, вызовет basename
только один раз (и не удастся некоторым приятным образом из-за разбиения слов.)
Если команда должна только обрабатывать одно имя файла, лучше было бы записать его как:
file=$(basename "$1" | cut -d '.' -f 1)
С кавычками. (или используя расширение оболочки с удалением суффикса $ {file %%. *}
вместо cut
, как Кусалананда показал .)
Если, на с другой стороны, он должен обрабатывать несколько имен файлов, может быть проще передать их с помощью массива или в позиционных параметрах (все они, а не только $ 1
).