Найти: заменить выражение переменной

Самый простой способ просмотреть метаданные бинарного пакета Debian — использовать less(, если быть точным, препроцессор less)бинарного пакета. Другими словами:

less pkgname...deb

Вот соответствующее содержание /bin/lesspipe.

            *.deb|*.udeb|*.ddebi|*.ipk)
                        echo "$1:"; dpkg --info "$1"
                        echo
                        echo '*** Contents:'; dpkg-deb --contents "$1"
                            ;;

Чтобы это работало, вам нужно добавить следующее куда-нибудь, где оно будет источником. ~/.bashrcхорошее место.

export LESSOPEN="|/usr/bin/lesspipe %s"
0
11.09.2019, 14:46
1 ответ

( Если только вы не используете zshв качестве интерактивной оболочки... )Проблема в том, что двойные кавычки будут восприниматься как часть шаблона. Команда, которую вы на самом деле запускаете, будет эквивалентна

find. -name '"Bik*"'

Вы получаете это, потому что оболочка будет выполнять разбиение слова -на не заключенное в кавычки $a, разбивая строку на два слова -nameи "Bik*". Затем слова подвергаются генерации имени файла ("подстановке" ), что означает, что "Bik*"будет расширено до всех имен файлов, соответствующих этому конкретному шаблону в текущем каталоге (, включая двойные кавычки ). Вряд ли у вас есть такие имена файлов, поэтому шаблон остается нераскрытым, а кавычки остаются.

Если бы вы использовали a='-name Bik*', то сработало бы , но только если у вас нет ничего, соответствующего Bik*в текущем каталоге.

Если бы в bashвы использовали shopt -s nullglob, обе попытки привели бы к ошибке из find, так как -nameне был бы задан шаблон (, оболочка удалила бы несопоставленный шаблоны ).

(В оболочке zshвы получите сообщение об ошибке от find, так как он не знает, что такое опция -name "Bie*", т.е. вся строка ; это связано с тем, что оболочка zshпо умолчанию не выполняет эти операции разбиения -и -глобуса на расширениях без кавычек.)

Вместо этого, если вы используете оболочку с массивами, используйте

a=( -name 'Bik*' )
find. "${a[@]}"

Это будет правильно цитировать каждое отдельное слово при использовании с findтак, как показано здесь.

Или вы могли бы использовать

a='Bik*'
find. -name "$a"

Связанные:

Также вторая половина из мое решение по установить -f внутри функции

3
28.01.2020, 02:22

Теги

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