Что делает эта командная строка (`echo $ 1 | xargs -n 1 basename | cut -d '.' -F1`)? [закрыто]

Загрузка файлов конфигурации при запуске зависит от того, какая среда рабочего стола используется. Если вы запустили свой xserver, набрав startx , это обычно будет означать, что он будет использовать .xinitrc (хранится в $ HOME).

Внутри .xinitrc вам нужно будет загрузить конфигурацию с различными сопоставлениями, например .xsessionrc

Затем вам понадобится следующая строка (в .xinitrc)

xrdb -merge ~/.xsessionrc 

Однако, если вы используете менеджер входа в систему, например как LightDM или GNOME вам нужно будет найти такой же эквивалент

1
25.11.2018, 02:18
4 ответа

Комбинация 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 ).

1
27.01.2020, 23:19

Строка извлекает имена файлов без расширений из путей, предоставленных через $ 1 (первый аргумент сценария, в котором появляется эта строка). Результат сохраняется в переменном файле .

Демо:

$ echo /etc/dhcpcd.conf ../foo/bar/filename.tar.gz | xargs -n 1 basename | cut -d '.' -f1
dhcpcd
filename
1
27.01.2020, 23:19

Строка сохраняет имя файла без расширения и пути в переменной $ file .

Подробно:

echo $ 1 выводит первый аргумент командной строки, переданный скрипту, xargs -n 1 basename передает отображаемую строку в качестве аргументов команде basename , который удаляет путь из имени файла. вырезать -d '.' -f1 удаляет расширение.

Так, например, если вы выполните

echo directory/test.sh | xargs -n 1 basename | cut -d '.' -f1

, результатом (сохраненным в $ file ) будет тест .

0
27.01.2020, 23:19

Присваивает часть имени файла (возможно, с путем) переменной file. В частности, бит перед первым . символ в имени самого файла. Другими словами, он берет что-то вроде /some/path/hello.world и анализирует бит hello.

Советом будет запускать каждую часть конвейера в командной строке:

$ thing="/some/path/hello.world"

$ echo "$thing"
/some/path/hello.world

$ echo "$thing" | xargs -n 1 basename
hello.world

$ echo "$thing" | xargs -n 1 basename | cut -d '.' -f 1
hello

Обратные кавычки используются для возврата вывода конвейера и назначения его файлу. $1 — это первый аргумент в командной строке (для любого скрипта или функции оболочки, частью которой он является).

Вероятно, единственная причина, по которой xargs -n 1 basename используется вместо обычного basename, заключается в том, что утилита basename не читает стандартные ввод, но xargs.

Более короткая (и более быстрая) версия того же самого в bash или ksh93 будет

file=${1##*/}
file=${file%%.*}
2
27.01.2020, 23:19

Теги

Похожие вопросы