Странное поведение при вырезании

При обращении к $ C Если на файл Вы имеете в виду полный путь к файлу, то это задание действительно очень легко. Есть несколько способов сделать это.

Используя только POSIX Shell Globs и расширение параметров, вы можете сделать:

c='/home/user/working-root-directory/band-folder/album-name/music-file.mp3'
file=${c##*/}
album=${c#*"${c%/*/"$file"}"/}
band=${c#*"${c%/*/"$album"}"/}
band=${band%%/*} album=${album%%/*}

в основном это работает, обрезая строку из хвоста переменной, а затем обрезающая результаты из головки переменной. В последней строке любые нежелательные останки от хвоста отдаются. Возможно, легче понять с реальными мировыми данными. Если вы должны были обернуть вышеупомянутый фрагмент в оболочке с помощью SET -X включен, вы увидите что-то вдоль этих строк, напечатанные в STDERR :

+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ file=music-file.mp3
+ album=album-name/music-file.mp3
+ band=band-folder/album-name/music-file.mp3
+ band=band-folder
+ album=album-name

другой способ сделать это Состоит в том, чтобы использовать внутренний сепаратор полевой сепараторы Shell, чтобы разделить путь на / границ.

set -f; IFS=/             #disable globbing so as not to gen more filenames
set -- $c                 #set the shell's arg array to split path
shift "$(($#-3))"         #remove all but relevant fields
band=$1 album=$2 file=$3  #assign values

Вот еще немного Set -x Выход:

+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ set -f
+ IFS=/
+ set -- '' home user working-root-directory band-folder album-name music-file.mp3
+ shift 4
+ band=band-folder
+ album=album-name
+ file=music-file.mp3
0
31.07.2015, 02:42
1 ответ

Проблемы воспроизведения сводятся к поставщику libc. А именно, похоже, что это ошибка в uclibc; см .: https://bugs.busybox.net/show_bug.cgi?id=4099

При определенных обстоятельствах, cut печатает первый символ поля 1 и все поле 2, когда ему предлагается напечатать поле 2 - так, например:

printf "4123\t2\t3\t4\t5\n" | cut -f 2

выводит 42; не только 2. Я запустил strace для этого разреза, и он показал, что cut печатает всю строку.

Ошибка, похоже, связана с тем, как он хочет обрабатывать строки без разделителей; так что на данный момент обходной путь заключается в использовании флага '-s'; примерно так:

printf "4123\t2\t3\t4\t5\n" | cut -f 2 -s

, что, как и ожидалось, печатает «2».

Я полагаю, что большинство людей, сталкивающихся с этим, используют buildroot; и я бы порекомендовал изменить конфигурацию uclibc по этой ссылке. В основном это просто означает:

make uclibc-menuconfig
Select y for 'String and Stdio Support --> Provide a macro version of [getc|putc]'

обратите внимание, что поскольку это меняет реализацию libc; вероятно, разумно также перестроить практически все.

3
28.01.2020, 02:27

Теги

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