Подсчитывает количество символов в строке PIDS, а затем обрезает последнюю запятую в конце строки.
# cat a.sh
#!/bin/bash
PIDS="1,2,3,4,5,"
echo "${PIDS}"
echo ${#PIDS}
echo "${PIDS:0:${#PIDS}-1}"
# ./a.sh
1,2,3,4,5,
10
1,2,3,4,5
В ответ на ваше обновление ваш вывод мне кажется странным.Разве вы не должны отображать токен 4 вместо 6 во втором «срезе»?Если, возможно, я неправильно понимаю ваши входные данные.Вот что я получил:
# cat a.dat
#npviewer. 2768 deel 11u REG 7,0 19218930 262562 /tmp/FlashXX2j3xhT (deleted)
#npviewer. 2768 deel 12u REG 7,0 32352982 262837 /tmp/FlashXX6R4nAq (deleted)
#npviewer. 2768 deel 17u REG 7,0 27289825 262824 /tmp/FlashXXuVBqbu (deleted)
#npviewer. 2768 deel 18u REG 7,0 21632133 262825 /tmp/FlashXXneoS8s (deleted)
# cat a.sh
#!/bin/bash
while read i; do
PID=`echo $i | cut -d " " -f 2`
FD=`echo $i | cut -d " " -f 4`
FD=`echo ${FD:0:${#FD}-1}`
echo $FD
done < a.dat
# ./a.sh
11
12
17
18
Хорошо, теперь я получаю именно то, о чем вы спрашиваете, и поскольку я раньше работал на Solaris, а сейчас на Linux, я получаю разные результаты.Так что, я думаю, точный синтаксис может варьироваться в зависимости от того, на какой оболочке / платформе вы находитесь.
Но я все же работал на моем Linux-устройстве под управлением Firefox.Разница в том, что в моей конфигурации, независимо от того, сколько окон ИЛИ вкладок я открываю, он все равно попадает под один и тот же идентификатор процесса (я использую Xubuntu с Firefox 3.6).Игнорируя это, мы все равно можем делать то, что вы пытаетесь сделать, выполняя процессы по одному и извлекая файловые дескрипторы для каждой итерации.См. Пример ниже:
user@host:~$ cat a
for p in `pgrep -f libflashplayer.so`
do
for f in `lsof -p $p | grep tmp/Fl | cut -d " " -f 6 | while read fd; do echo ${fd%[a-z]}; done`
do
echo "cp /proc/${p}/fd/${f} ${HOME}/${p}_${f}.flvdone"
done
done
user@host:~$ ./a
cp /proc/17492/fd/16 /home/user/17492_16.flvdone
cp /proc/17492/fd/19 /home/user/17492_19.flvdone
cp /proc/17492/fd/20 /home/user/17492_20.flvdone
Обратите внимание, что я не включил выражение "delete" grep, потому что оно не сразу удаляет файл в моей конфигурации.Посмотрите, можете ли вы изменить этот скрипт, чтобы он делал то, что вы пытаетесь сделать.Я не мог заставить часть $ {PIDS: 0: $ {# PIDS} -1} работать на моей машине, поэтому я переключаю команды подстроки, чтобы использовать вместо них оператор "%".Так получилось.