Я не могу понять, как перечислить различные пути в $PATH
по отдельности, чтобы они выглядели так:
/bin
/usr/bin
/usr/local/bin
и т. Д.
Кто-нибудь знает правильную переменную для этого?
Другой путь AWK состоит в том, чтобы рассматривать каждый каталог как отдельное запись , а не как отдельное поле .
awk 'BEGIN{RS=":"} {print [110]}' <<<"$PATH"
, я нахожу тот синтаксис особенно интуитивным. Но, если Вам нравится, можно сократить его путем создания print [115]
неявный (это - действие по умолчанию, и 1
оценивает к истинному, заставляя это быть сделанным для каждой строки):
awk 'BEGIN{RS=":"} 1' <<<"$PATH"
входной и выходной разделитель записей AWK по умолчанию является новой строкой (разрыв строки). Путем установки входного разделителя записей (RS
) на :
прежде, чем считать вход, AWK автоматически анализирует двоеточие-deliminated $PATH
в его constitutent имена каталогов. AWK расширяется [1110]
до каждой целой записи, новая строка остается , производит разделитель записей, и никакое цикличное выполнение или gsub
не необходимо.
ek@Io:~$ echo "$PATH"
/home/ek/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ek@Io:~$ awk 'BEGIN{RS=":"} {print [112]}' <<<"$PATH"
/home/ek/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
AWK часто используется для парсинга записей в отдельные поля, но нет никакой потребности в этом только для построения списка имен каталогов.
Это работает даже на вход, содержащий пробелы (пробелы и вкладки), даже несколько последовательных пробелов:
ek@Io:~$ awk 'BEGIN{RS=":"} {print [113]}' <<< таким образом, если Вы не вызываете AWK к [1 118], восстанавливают запись (см. ниже), это не проблема, чтобы иметь пробелы или вкладки (разделители полей по умолчанию) во входе. Ваш PATH
, вероятно, не содержит пробелы в системе Ubuntu, но если она сделает, то это будет все еще работать.
<час> Это стоит упомянуть как примечание стороны, что способность AWK интерпретировать запись как набор полей становится полезной для связанной проблемы построения таблицы компонентов каталога :
ek@Io:~$ awk -F/ 'BEGIN{RS=":"; OFS="\t"} {$1=$1; print [114]}' <<<"$PATH"
home ek bin
usr local sbin
usr local bin
usr sbin
usr bin
sbin
bin
usr games
usr local games
snap bin
любопытное $1=$1
присвоение служит цели вынудить AWK восстановить запись .
(Это, вероятно, более полезно для случаев, где дополнительная обработка должна быть сделана на компонентах, чем для точного примера, показанного простой печати таблицы.)
ab\t\t c:de fg:h'
ab c
de fg
h
таким образом, если Вы не вызываете AWK к [1 118], восстанавливают запись (см. ниже), это не проблема, чтобы иметь пробелы или вкладки (разделители полей по умолчанию) во входе. Ваш PATH
, вероятно, не содержит пробелы в системе Ubuntu, но если она сделает, то это будет все еще работать.
Это стоит упомянуть как примечание стороны, что способность AWK интерпретировать запись как набор полей становится полезной для связанной проблемы построения таблицы компонентов каталога :
ek@Io:~$ awk -F/ 'BEGIN{RS=":"; OFS="\t"} {$1=$1; print [114]}' <<<"$PATH"
home ek bin
usr local sbin
usr local bin
usr sbin
usr bin
sbin
bin
usr games
usr local games
snap bin
любопытное $1=$1
присвоение служит цели вынудить AWK восстановить запись .
(Это, вероятно, более полезно для случаев, где дополнительная обработка должна быть сделана на компонентах, чем для точного примера, показанного простой печати таблицы.)
Я использую "Функции Пути Bash Stephen Collyer" (см. его статья в Журнале Linux). Это разрешает мне использовать разделенный список "двоеточия" в качестве типа данных в программировании оболочки. Например, я могу произвести список всех каталогов в текущем каталоге:
dirs="";for i in * ; do if [ -d $i ] ; then addpath -p dirs $i; fi; done
Затем listpath -p dirs
производит список.
Через awk.
echo $PATH | awk -F: '{for(i=1;i<=NF;i++)print $i}'
Через Python.
$ echo $PATH | python3 -c 'import fileinput
for line in fileinput.input():
for i in line.split(":"):
print(i)'
Примечание, что Добавление отступа очень важно в Python.
fileinput
, когда Вы могли просто использовать input
: python3 -c 'print(*input().split(":"), sep="\n")' <<< "$PATH"
– Michael Borgwardt
07.11.2018, 17:16
Вероятно, единственным путем, который не был упомянут, является способ, которым я использовал его в течение многих лет:
echo $PATH | tr ":" "\n"
так, в Вашем .profile или .bash_profile или что бы то ни было, можно добавить:
alias path='echo $PATH | tr ":" "\n"'
Начиная со всех языков сценариев уже был взят, я пойду с C. Довольно легко получить переменные среды с get_env()
функция (см. GNU C документация Библиотеки ). Остальное - просто символьное управление
bash-4.3$ cat get_path.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *path = getenv("PATH");
int length = strlen(path) -1;
for(int i=0;i<=length;i++){
if (path[i] == ':')
path[i] = '\n';
printf("%c",path[i]);
}
printf("\n");
return 0;
}
bash-4.3$ gcc get_path.c
bash-4.3$ ./a.out
/home/xieerqi/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/opt/microchip/xc16/v1.25/bin
/opt/microchip/xc32/v1.40/bin
/opt/microchip/xc8/v1.35/bin
/home/xieerqi/bin
/home/xieerqi/bin/sh
<час> , Но также и потому что, "почему не", вот альтернативная версия Python через параметры командной строки sys.argv
python -c 'import sys; print "\n".join(sys.argv[1].split(":"))' "$PATH"
<час> Ruby не идет с Ubuntu по умолчанию, в отличие от компилятора C и интерпретатора Python, но если бы Вы когда-нибудь используете его, решение в Ruby было бы этим:
ruby -ne 'puts В этом ответе:
- Python
-
- Ruby C
- Альтернативный awk
1. C
Начиная со всех языков сценариев уже был взят, я пойду с C. Довольно легко получить переменные среды с get_env()
функция (см. GNU C документация Библиотеки ). Остальное - просто символьное управление
[110] <час> 2. Python
, Но также и потому что, "почему не", вот альтернативная версия Python через параметры командной строки sys.argv
[111] <час> 3. Ruby
Ruby не идет с Ubuntu по умолчанию, в отличие от компилятора C и интерпретатора Python, но если бы Вы когда-нибудь используете его, решение в Ruby было бы этим:
[112] , Как предложено 7stud (Большое спасибо!) в комментарии , это может также быть сокращено с [1 126]
ruby -F: -ane 'puts $F' <<<$PATH
ruby -0072 -ne 'puts chomp' <<<$PATH
4. Альтернативный awk
Мы можем использовать split()
функция для повреждения по линии считанный в массив и использование for-each
цикл для распечатывания каждого объекта на отдельной строке.
awk '{split([115],arr,":"); for(var in arr) print arr[var]}' <<< $PATH
.split(":")' <<< "$PATH"
, Как предложено 7stud (Большое спасибо!) в комментарии , это может также быть сокращено с [1 126]
ruby -F: -ane 'puts $F' <<<$PATH
ruby -0072 -ne 'puts chomp' <<<$PATH
Мы можем использовать split()
функция для повреждения по линии считанный в массив и использование for-each
цикл для распечатывания каждого объекта на отдельной строке.
awk '{split([115],arr,":"); for(var in arr) print arr[var]}' <<< $PATH
Нам нужно больше Java!
public class GetPathByLine {
public static void main(String[] args) {
for (String p : System.getenv("PATH").split(":")) {
System.out.println(p);
}
}
}
Сохраняют это к GetPathByLine.java
, и использование компиляции:
javac GetPathByLine.java
Выполнение с:
java GetPathByLine
<час> ┌─[17:06:55]─[kazwolfe@BlackHawk]
└──> ~ $ cat GetPathByLine.java
public class GetPathByLine {
public static void main(String[] args) {
for (String p : System.getenv("PATH").split(":")) {
System.out.println(p);
}
}
}
┌─[17:06:58]─[kazwolfe@BlackHawk]
└──> ~ $ javac GetPathByLine.java
┌─[17:07:02]─[kazwolfe@BlackHawk]
└──> ~ $ java GetPathByLine
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
python3 -c "import os; [print(p) for p in os.getenv('PATH').split(':')]"
– Michael Borgwardt
07.11.2018, 17:11
Используя xargs
:
xargs -n1 -d: <<< $PATH
От man xargs
-n max-args
Use at most max-args arguments per command line.
-d delim
Input items are terminated by the specified character.
echo $PATH | xargs -n1 -d: echo
быть избыточным или это doesn' t вопрос?
– Eduardo Cuomo
03.04.2015, 20:59
echo $PATH | xargs -n1 -d:
сделает то же самое для Вас, но Вы будете использовать еще одну оболочку. Первый оценит echo $PATH
и передаст вывод по каналу для следующего окружения, чтобы сделать остальных.
– Neeraj Shukla
08.04.2015, 01:46
Вот эквивалент в Движении:
$ cat path.go
package main
import (
"fmt"
"os"
"strings"
)
func main() {
for _, p := range strings.Split(os.Getenv("PATH"), ":") {
fmt.Println(p)
}
}
$ go run path.go
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/home/nathan/.local/bin
/home/nathan/go/bin
Используя IFS:
(set -f; IFS=:; printf "%s\n" $PATH)
IFS
содержит символы, на которых удар делает разделение, таким образом, IFS
с :
заставляет удар разделить расширение $PATH
на :
. printf
циклы аргументы по строке формата, пока аргументы не исчерпываются. Мы должны отключить globbing (подстановочное расширение) использование set -f
так, чтобы подстановочные знаки в именах каталогов ПУТИ не становились расширенными.
Используйте удар Расширение Параметра :
echo "${PATH//:/ Это заменяет весь :
в $PATH
новой строкой (\n
) и печатает результат. Содержание $PATH
остается неизменным.
, Если Вы только хотите заменить первое :
, удалите вторую наклонную черту: echo -e "${PATH/:/\n}"
\n'}"
Это заменяет весь :
в $PATH
новой строкой (\n
) и печатает результат. Содержание $PATH
остается неизменным.
, Если Вы только хотите заменить первое :
, удалите вторую наклонную черту: echo -e "${PATH/:/\n}"
${parameter/pattern/string}
– Alex
24.03.2015, 07:18
Вот еще несколько подходов. Я использую PATH
с каталогами, содержащими обратные косые черты, пробелы и даже новую строку, чтобы показать, что они должны работать с чем-либо (кроме cut
тот, который перестал работать на новых строках):
$ echo "$PATH"
/bin:usr/bin/:/usr/local/bin:/some\ horrible thing:/even
new lines
Некоторый Perl пути:
$ perl -pe 's/:/\n/g' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
Эти -p
означает, "печатают каждую входную строку после применения сценария, данного [1 111]". Сценарий использует оператор (s/oldnew/
) замены для замены всего :
новыми строками.
$ perl -lne 'print for split /:/' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
Эти -l
добавляет новую строку к каждому print
вызов. Здесь, сценарий разделяет свой вход на [1 116] и затем циклы по каждому элементу разделения и печатает его.
$ perl -F: -ane '$"="\n";print "@F"' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
Эти -a
делает perl
, ведут себя как [1 119]: это разделит каждую из своих входных строк на символе, данном [1 120] (так :
, здесь), и сохранит результат в массиве @F
. Эти $"
специальная переменная Perl, "разделитель элементов списка", значение которого печатается между каждым элементом печатного списка. Так установка его к новой строке сделает print @list
печать каждый элемент [1 125] и затем новая строка. Здесь, мы используем его для печати @F
.
$ perl -F: -ane 'print join "\n", @F' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
Та же идея как выше, просто менее игравший в гольф. Вместо того, чтобы использовать $"
, мы явно join
луг массив с новыми строками и затем печатью.
Простой grep
с волшебством PCRE:
$ grep -oP '(^|:)\K[^:]+' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
Эти -o
делает grep
печать только часть соответствия каждой строки, таким образом, каждое соответствие печатается на отдельной строке. Эти -P
включает Perl совместимые регулярные выражения (PCRE). regex ищет фрагменты не - :
([^:]+
), которые следуют или за началом строки (^
) или :
символ. Эти \K
прием PCRE, который означает "отбрасывание что-либо подобранное перед этой точкой" и используется здесь, чтобы не печатать :
также.
И cut
решение (эти сбои на новых строках, но может иметь дело с обратными косыми чертами и пробелами):
$ cut -d: -f 1- --output-delimiter= используемые опции -d:
, который устанавливает входной разделитель на [1 141], -f 1-
, что означает, печатают все поля (от 1-го в конец) и --output-delimiter=, который устанавливает, ну, в общем, выходной разделитель. Эти ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке.
Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
$ perl -0x3a -l012 -pe '' <<<"$PATH"
Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке. Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
<час> @7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
\n'
ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке. Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
используемые опции -d:
, который устанавливает входной разделитель на [1 141], -f 1-
, что означает, печатают все поля (от 1-го в конец) и --output-delimiter=, который устанавливает, ну, в общем, выходной разделитель. Эти
ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке.
Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
$ perl -0x3a -l012 -pe '' <<<"$PATH"
Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке. Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
<час> @7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!
\n'
ANSI C заключение в кавычки и способ распечатать символ новой строки в оболочке. Во всех вышеупомянутых примерах, я использую удар (и некоторые другие оболочки) здесь строка оператор (<<<
) для передачи строки как входа к программе. Так command <<<"foo"
эквивалентно [1 147]. Обратите внимание, что я всегда заключаю в кавычки "$PATH"
без кавычек, оболочка съела бы символ новой строки.
@7stud дал другой подход в [1 168] комментарии , это просто слишком хорошо для не включения:
[117] Эти -pe
будет print каждая входная строка после применения сценария, данного [1 164]. Здесь нет никакого сценария, потому что вся работа сделана флагами опции, как описано выше!