Сокет - это файл для обмена данными между процессами. Вы можете увидеть больше данных о нем с помощью команд netstat, lsof и fuser.
Из Википедии : https://en.wikipedia.org/wiki/Unix_domain_socket
"Доменный сокет Unix или IPC-сокет (межпроцессный коммуникационный сокет) - это конечная точка обмена данными между процессами, выполняющимися на одном и том же хосте операционной системы. Как и именованные трубы, сокеты домена Unix поддерживают передачу надежного потока байтов (SOCK_STREAM, сравните с TCP)."
.
В стандартной оболочке:
$ path=/aaa/bbb/ccc/ddd/eee/fff.txt
$ tail="${path#/*/*/}"
$ head="${path%/$tail}"
$ echo "$head" "$tail"
/aaa/bbb ccc/ddd/eee/fff.txt
"${path#/*/*/}"
— это значение path
, но с удаленной (кратчайшей )ведущей частью, соответствующей /*/*/
, то есть хвостовой частью. Тогда "${path%/$tail}"
— это path
с косой чертой и удаленной хвостовой частью.
Это приведет к неправильным результатам, если в пути недостаточно компонентов, поэтому вы можете сначала проверить это.
Кроме того, в Bash мы можем использовать сопоставление регулярных выражений внутри [[.. ]]
и подобрать совпадающие части:
$ if [[ $path =~ (/[^/]+/[^/]+)/(.*) ]]; then
echo "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi
/aaa/bbb ccc/ddd/eee/fff.txt
[[... ]]
работает как условие, поэтому здесь просто использовать if
, чтобы убедиться, что в пути достаточно компонентов.
Учитывая, что префикс является статическим, вы можете использовать расширение параметра, чтобы удалить его:
df_test=/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/iii.txt
cd /aaa/bbb
operate=${df_test#/aaa/bbb}
echo Operating on "$operate"
Лично мне нравится cut
вместо этого:
$ echo "/aaa/bbb/ccc/ddd/eee/fff.txt" | cut -d'/' -f4-
ccc/ddd/eee/fff.txt
Вам просто нужно настроить аргумент -f
настолько глубоко, насколько вы хотите, чтобы он анализировал дерево каталогов.
Здесь показано, как избавиться от первых двух полей, используяawk
:
$ echo "/aaa/bbb/ccc/ddd/eee/fff.txt" | awk -F'/' -v OFS='/' '{$1=$2=$3=""; print}' | sed 's#///##'
ccc/ddd/eee/fff.txt