Экспортируйте переменную $ PATH, построчно


22

Вдохновлен этим вопросом на AskUbuntu.

Ваша работа чрезвычайно проста. Возьмите переменную окружения PATH ( echo $PATH) и экспортируйте ее так, чтобы каждая запись (разделенная :символом) находилась в отдельной строке.

Например, если PATH есть /bin:/usr/bin:/usr/local/bin, ваша программа должна вывести:

/bin
/usr/bin
/usr/local/bin

Ваша программа может не возвращать ведущий символ новой строки, но она может возвратить один завершающий символ новой строки. Вам не нужно проверять, является ли путь PATH правильным или каталог существует. Ваша программа не должна принимать никаких данных, это означает, что ваша программа сама отвечает за получение PATH. Вы можете с уверенностью предположить, что объекты в PATH не содержат :или переводы строк. Тем не менее, пробелы являются честной игрой.

Ссылочные реализации присутствуют в ответах на вопрос выше.

правила

  • Это (очевидно) код-гольф, поэтому самый короткий ответ выиграет ценную зеленую галочку.
  • Принятый ответ будет проверен, чтобы убедиться, что он на самом деле законный.
  • Обе записи Windows и * nix принимаются.
    • Однако, если вы не укажете явно Windows, я попытаюсь запустить ее в Linux и не получится. (Если это очевидно (привет, Пакет!), Вам не нужно указывать явно.)
  • Есть только одно решение для ответа. Если у вас есть версия для Windows и * nix, я буду считать более короткую версию.
  • Если два ответа имеют одинаковую длину, я отдам приоритет тому, который набрал наибольшее количество голосов. Если у них одинаковое количество голосов, я буду считать старшего. Если опубликованное время совпадает, я выберу тот, который выполняется быстрее. Если они выполняются в одно и то же время, я не знаю.

Leaderboard


Ааа! Было трудно посетить Вопрос AskUbuntu, не дав чаевых в гольф.
Роман Греф

Некоторые из ответов (оболочки), похоже, предполагают, что путь не содержит пробелов. Должны ли они быть исправлены?
Деннис

@Dennis Как правило, переменная пути не должна иметь пробелов, но, как они могут, они должны быть исправлены. Тем не менее, мы можем с уверенностью предположить, что сами пути не будут содержать: или перевод строки.
Каз Вулф

Является ли функция приемлемой?
corvus_192

@ corvus_192 Если проблема явно не говорит иначе, функции разрешены.
Деннис

Ответы:


12

Z shell (zsh), 13 байт

<<<${(F)path}

Использует $pathпараметр , который является специальным параметром массива, используемым оболочкой, привязанным к $PATHпараметру, и флагом раскрытия параметра для объединения массива с символами новой строки.


3
Видимо, кто-то просто играет в гольф @Dennis ... Ха.
wizzwizz4

Как псевдоним какое-то слово к этому? Я пытался, alias path="<<<${(F)path}"но при выполнении он печатает, а /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binзатем идетsbin
Даниэль Спрингер

@DanielSpringer $ path расширяется во время определения псевдонима, что вам не нужно. Вместо этого используйте одинарные кавычки:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction, которая работала! Почему двойные кавычки не работают?
Даниэль Спрингер

@DanielSpringe Здесь не так много места, чтобы объяснить, вот пастбин
GammaFunction

13

Bash / Coreutils, 17 16 байт

tr : '
'<<<$PATH

tr : '\n'<<<$PATHдолжно сработать
Арно

Оно делает . , , редактирование прямо сейчас
Сергей Колодяжный

Я думаю, что вы также можете удалить пробелы вокруг <<<(проверено только на Ubuntu)
Арно

@Arnauld Я не думаю, что это единственное, что есть в Ubuntu, это что-то вроде bash, так что надо работать через дистрибутивы
Сергей Колодяжный

6
Он не сохраняет байты, но использование \\nвместо указанной в кавычках более удобной для чтения imho.
Деннис

10

Пакет, 41 байт

@for %%a in ("%PATH:;=";"%")do @echo %%~a

PATHконечно же, в Windows разделена точкой с запятой. Удобно, forпо умолчанию разделяется на точки с запятой, но неудобно, также на пробелах, поэтому я должен использовать хитрость замены строки, чтобы заключить каждый элемент пути перед разбиением. Затем остается удалить цитаты после этого.


1
Запуск из командной строки можно заменить %%на %сохранение 2 байта.
ДэвидПостилл

@DavidPostill Разве это не делает его фрагментом кода, а не программой?
Нил

Я не уверен, каков точный кодекс правил гольфа, но разве большинство других ответов не являются просто фрагментами? Большинству из них для запуска требуется «оболочка» некоторого описания ...
DavidPostill

9

Z shell (zsh), 15 байтов

<<<${PATH//:/
}

Вы можете протестировать код на Anarchy Golf : нажмите на форму , выберите zsh , вставьте код и отправьте.

Bash (чистый), 19 байт

echo "${PATH//:/
}"

Та же идея, но с меньшим синтаксисом Бэша. Проверьте это на Ideone .


6

Powershell, 20 байт

$env:PATH-split':'

Редактировать:

  • -2 байта выкл. Благодаря @TimmyD

Старый:

$env:PATH.split(":")

5

Рубин, 25 байт

puts ENV["PATH"].split":"

Хороший, чуть-чуть короче, чем мой ответ на оригинальный вопрос на AskUbuntu
Сергей Колодяжный

Вам не нужно считать вызов Ruby, только саму программу, так что это всего 26 байтов.
Джордан

@ Джордан этого не знал. Это в FAQ?
Анвар

@Jordan Это показано в самом туре. Итак, отредактировано. Спасибо за это
Анвар

1
О, также вы можете изменить split ":"на split":"или split ?:для 1 байта.
Джордан,

4

Perl, 22 байта

say$ENV{PATH}=~y/:/
/r

Необходимо -Eили -M5.010запустить:

perl -E 'say$ENV{PATH}=~y/:/
/r'

3

Bash + Python, 43 байта

Давайте использовать расширение переменной оболочки. Это исключает вызовы os.environ, тем самым меньше кода и меньше импорта. Это дает нам 46 байтов, и с xnorтрюком и удалением места, прежде чем -cмы получим 43 байта.

python -c"print('$PATH'.replace(*':\n'))"

Обратите внимание, что это не удастся, если в вашей переменной PATH появится каталог с одинарной кавычкой или обратной косой чертой.
Джои Марианер

@JoeyMarianer Так как в строке имени файла / пути может быть почти любой символ, тогда да - это может не получиться, и PATH расширится до '/ dir'1: / dir2', что дает неправильно отформатированную команду для python. Обратная косая черта не обязательно дает сбой - она ​​просто интерпретирует то, что находится в самой строке. ИМХО, экранирование обратной косой черты не должно появляться в именах путей обычного пользователя, поэтому в 99% случаев это нормально. Я, однако, согласен - об этом следует помнить всякий раз, когда вы имеете дело с оболочкой прямо или косвенно, как в этом случае
Сергей Колодяжный

3

Java, 58 байт

System.out.print(System.getenv("Path").replace(';','\n'));

Полная программа: 106 байт

class E {
    public static void main (String[] args) {
        System.out.print(System.getenv("Path").replace(';', '\n'));
    }
}

3

GNU sed+ bash, 25 байт:

sed 's/:/\n/g' <<<"$PATH"

Если PATHимя каталога не содержит пробелов, кавычек не требуется, 23 байта:

sed 's/:/\n/g' <<<$PATH

Еще короче, транслитерация :на новую строку , благодаря @Dennis :

sed y/:/\\n/<<<"$PATH"

3

Vim, 19 байт

"=$PATH<CR>p:s/:/\r/g<CR>

Возьмите $PATHиз регистра выражения и вставьте его. Преврати :s в новые строки. Ничего хитрого.


Они должны поместить это в учебники Vim. Как человек, читающий о том, как попасть в Vim, я ценю этот пример.
loa_in_

2

PHP, 36 35 33 32 байта

Сохранено 1 байт, благодаря Blackhole.
Сохранено 2 байта, благодаря пользователю 59178.
сохранено 1 байт, благодаря Martijn

* NIX версия

<?=strtr(getenv(PATH),":","
")?>

Версия для Windows

<?=strtr(getenv(PATH),";","
")?>

1
@ RomanGräf *nix- это просто способ обращения к Unix-подобной системе.
Арно

1
Если вы хотите «мультиплатформенную» версию, вы можете использовать константуPATH_SEPARATOR
Исмаэль Мигель

1
Не используйте \n, но вместо этого используйте новую строку, это сэкономит вам один байт.
Blackhole

1
Вы также можете бросить "S вокруг PATH. Вы получаете уведомление «использование неопределенной константы», но оно все еще работает, экономя 2 байта.
user59178

1
Используя короткое эхо, вы <?=strtr(getenv(PATH),":","")?>сохраняете байт (* не можете переводить строки в комментариях)
Мартейн

2

Python 2, 49 байт

Сохранение 2 байта благодаря @xnor и 1 байт путем замены environс getenvблагодаря @Serg и @Oliver

import os
print os.getenv('PATH').replace(*':\n')

Для Python 3, просто добавьте (и )вокруг printаргумента и добавить 1 к счетчику байтов.


Как это получит вход?
Анвар

2
@ Анвар из os.environ ['PATH'], который вернет строку
Сергей Колодяжный

1
@ Серг ах. понял.
Анвар

2
replaceможет принять упакованные аргументы replace(*':\n').
xnor

3
@KarlNapf Да, это главное. Эта программа как есть не работает в Python 3, поэтому вы должны указать версию, с которой она работает.
Денкер

2

C, 85 84 байта

-1 байт для использования #import

#import<stdlib.h>
main(){char*a=getenv("PATH");while(*a)putchar(*a++==58?10:a[-1]);}

1

Ракетка 39 байт

Используя команду sed @heemayl:

(system "sed 's/:/\\n/g' <<<\"$PATH\"")

Ungolfed:

(define (f)
  (system "sed 's/:/\\n/g' <<<\"$PATH\"")
)

Тестирование:
(е)

Выход:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t

1

Скала, 31 байт

sys env "PATH"replace(':','\n')

В Scala, a b cэто синтаксический сахар для a.b(c), так что это компилируется вsys.env("PATH").replace(':','\n')



1

C #, 64 байта

x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

Анонимная функция, которая возвращает переменную пути, каждый каталог в отдельной строке. Обратите внимание, что xэто просто фиктивный объект для сохранения 1 байта вместо использования() .

Полная программа:

using System;

namespace ExportPathVariable
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<object,string>f= x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

            Console.WriteLine(f(0));
        }
    }
}

Также работает на системах UNIX , если заменить ;с :, предполагая библиотеки Mono доступны. Попробуйте онлайн на ideone. .NET Fiddle возвращает исключение безопасности.

В качестве альтернативы, полная программа на C #, которая довольно многословна:


C #, 118 байт

using System;class P{static void Main(){Console.Write(Environment.GetEnvironmentVariable("PATH").Replace(";","\n"));}}

1

Haskell, 72 байта

import System.Environment
m ':'='\n'
m x=x 
map m<$>getEnv"PATH">>=putStr

Дорогой импорт и отсутствие replaceв стандартной библиотеке делают его довольно длинным.


неужели m ':'...это пространство не нужно?
кот

1
@cat: пробел является обязательным, поскольку 'является допустимым символом в идентификаторах. Без пробела мы бы определили функцию с именем m'.
Ними

1

C (x86), 60 байт

f(){char*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Это не будет работать на 64-битных платформах без включения stdlib.h , так как getenv возвращает int (32 бита), а char указатели на имеют ширину 64 бита.

Я еще не нашел онлайн 32-битный компилятор C.

C (x86-64), 70 байт

f(){char*getenv(),*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Вместо того, чтобы включать stdlib.h , мы объявляем getenv как функцию, возвращающую символ указатель .

Я проверил это с помощью gcc и clang в Linux; другие установки могут плакать кровью. Попробуйте это на Ideone .


1

Фактор , 28 байт

для unix-лайков. Я не знаю, как это сделать на Windows, так как я не на Windows box.

"PATH"getenv ":" "\n"replace

1

JQ, 18 символов

(16 символов кода + 2 символа командной строки)

env.PATH/":"|.[]

Образец прогона:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ jq -nr 'env.PATH/":"|.[]'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

1

Awk, 51 44 персонажа

BEGIN{$0=ENVIRON["PATH"];gsub(":",RS);print}

Благодаря:

  • ninjalj за предложение использовать gsub()вместо манипулирования встроенными переменными (-7 символов)

Типичным awkспособом было бы установить встроенные переменные, которые влияют awkна автоматическую обработку данных:

BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}

Образец прогона:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ awk 'BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

Doh. Вы правы, @ninjalj. Я должен был сосредоточиться на том, чтобы делать это определенным awkобразом. Спасибо.
Манатворк

0

Node.js, 36 байт

_=>process.env.PATH.split`:`.join`
`

Довольно прямо вперед.


0

MATLAB, 34 байта

disp(strrep(getenv('PATH'),58,10))

Вот онлайн-демонстрация в Octave с небольшой модификацией, поскольку strrepв октаве второй и третий входные данные должны быть charпеременными, а не числовыми значениями.




0

Гема, 36 знаков

\A=@subst{\\:=\\n;@getenv{PATH}}@end

Образец прогона:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ gema '\A=@subst{\\:=\\n;@getenv{PATH}}@end'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

0

Отпечаток пальца Befunge-98 + EVAR, 34 байта

"RAVE"4("HTAP"Gv
:!k@:':-!'0*-, >

Загружает EVAR fingerprint ( "RAVE"4() для легкого доступа к переменным окружения, получает PATH envvar ( "HTAP"G) и для каждого символа выходит из программы, если символ «\ 0» ( :!k@), вычитает ASCII 48 «0», если char - ASCII 58 ":" ( :':-!'0*-) и выводит символ ( ,).


0

ELF / x86, 78 байт

00000000  7f 45 4c 46 01 00 00 00  43 0f 00 00 43 5f eb 10  |.ELF....C...C_..|
00000010  02 00 03 00 0c 50 eb 10  0c 50 eb 10 04 00 00 00  |.....P...P......|
00000020  5f 5f b1 05 be 49 50 eb  10 3d 20 00 01 00 5f f3  |__...IP..= ..._.|
00000030  a6 75 ef 89 f9 80 3f 3a  75 03 80 2f 30 42 ae 75  |.u....?:u../0B.u|
00000040  f4 4a 04 04 cd 80 93 cd  80 50 41 54 48 3d        |.J.......PATH=|
0000004e

NASM источник:

BITS 32                                         ;
ORG 0x10eb5000                                  ;
                                                ;   ELF HEADER    --   PROGRAM HEADER
; ELF HEADER                                    ; +-------------+
DB 0x7f,'E','L','F'                             ; | magic       |    +--------------------+
                                                ; |             |    |                    |
; PROGRAM HEADERS                               ; |             |    |                    |
DD 1                                            ; |*class   32b | -- | type: PT_LOAD      |
                                                ; |*data   none |    |                    |
                                                ; |*version   0 |    |                    |
                                                ; |*ABI    SysV |    |                    |
DD 0xf43        ; offset = vaddr & (PAGE_SIZE-1); |*ABI vers    | -- | offset             |
                                                ; |             |    |                    |
entry:  inc     ebx     ; STDOUT_FILENO         ; |*PADx7       | -- | vaddr = 0x10eb5f43 |
        pop     edi     ; discard argc          ; |             |    |                    |
        jmp     short skip                      ; |             |    |                    |
DW 2                                            ; | ET_EXEC     | -- |*paddr LO           |
DW 3                                            ; | EM_386      | -- |*paddr HI           |
DD 0x10eb500c                                   ; |*version     | -- | filesz             |
DD 0x10eb500c                                   ; | entry point | -- | memsz              |
DD 4                                            ; | ph offset   | -- | flags: RX          |
                                                ; |             |    |                    |
skip:   pop     edi     ; discard argv[0]       ; |*sh offset   | -- |*align              |
        pop     edi     ; discard argv[1]=NULL  ; |             |    |                    |
env:    mov     cl,5    ; \ strlen("PATH=")     ; |             |    |                    |
        mov     esi,PATH; > "PATH="             ; |*flags    /--|    |                    |
DB 0x3d         ; cmp eax,0x10020               ; |*ehsize      |    +--------------------+
DW 32                                           ; | phentsize   |
DW 1                                            ; | phnum       |
                                                ; |             |
        pop     edi     ; > envp                ; |*shentsize   |
        repe    cmpsb   ; > strcmp(envp,"PATH="); |*shnum       |
        jne     env     ; /                     ; |*shstrndx    |
        mov     ecx,edi                         ; +-------------+

nlcolon:cmp     byte[edi],58  ; \ if (char == ':')
        jne     nosub         ; >
        sub     byte[edi],48  ; >   char -= '0'
nosub:  inc     edx           ; > wlen++
        scasb                 ; >
        jne     nlcolon       ; / while(char != 0)

        dec     edx           ; wlen--
        add     al,4
        int     0x80          ; write(1, ecx, wlen)
        xchg    eax,ebx
        int     0x80          ; exit(...)

PATH: db "PATH="
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.