$ 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를 실행하려고 시도하고 실패합니다. (확실한 경우 (hi, Batch!) 명시 적으로 지정할 필요가 없습니다.)
  • 답변 당 하나의 솔루션 만 있습니다. Windows 및 * nix 버전이 모두있는 경우 더 짧은 버전을 계산합니다.
  • 두 답변의 길이가 같은 경우, 총 투표 수가 높은 답변에 우선 순위를 부여합니다. 그들이 같은 투표 합계를 가지고 있다면, 나는 더 오래된 투표를 계산합니다. 게시 된 시간이 동일하면 더 빨리 실행되는 시간을 선택합니다. 그들이 같은 시간에 실행한다면, 나는 모른다.

리더 보드


아! 골프 팁을주지 않고 AskUbuntu Question을 방문하기가 어려웠습니다.
Roman Gräf

(쉘) 답변 중 일부는 경로에 공백이 없다고 가정합니다. 수정해야합니까?
Dennis

@Dennis 일반적으로 경로 변수에는 공백이 없어야하지만 가능하면 수정해야합니다. 그러나 경로 자체에는 : 또는 개행 문자가 포함되지 않는다고 가정 할 수 있습니다.
Kaz Wolfe

기능이 허용됩니까?
corvus_192

@ corvus_192 챌린지 가 달리 명시 하지 않는 한 기능이 허용됩니다.
Dennis

답변:


12

Z 셸 (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 작동했습니다! 큰 따옴표 작동 하지 않는 이유는 무엇 입니까?
Daniel Springer

@DanielSpringe 여기에 설명 할 공간이 많지 않습니다. 여기에 pastebin이 있습니다. ix.io/1RyW
GammaFunction

13

Bash / Coreutils, 17 16 바이트

tr : '
'<<<$PATH

tr : '\n'<<<$PATH잘 작동합니다
Arnauld

그렇습니다 . . . 지금 수정
Sergiy Kolodyazhnyy

나는 당신도 주변 공간을 제거 할 수 있다고 생각합니다 <<<(우분투에서만 테스트 됨)
Arnauld

@Arnauld 나는 그것이 우분투라고 생각하지 않습니다, 그것은 bash 일입니다. 그래서 배포판을 따라 작동해야합니다
Sergiy Kolodyazhnyy

6
바이트를 저장하지 않지만 \\n따옴표로 묶은 변수 대신 사용 하는 것이 더 읽기 쉽습니다.
Dennis

10

배치, 41 바이트

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

PATH물론 Windows에서는 세미콜론으로 구분됩니다. 편리하게 for는 기본적으로 세미콜론으로 분할되지만 불편 하게도 공백에서도 분할되므로 분할하기 전에 각 경로 요소를 인용하려면 string replace trickery를 사용해야합니다. 그런 다음 따옴표를 제거합니다.


1
당신이 대체 할 수있는 명령 줄에서 실행 %%%2 바이트를 절약.
DavidPostill

@DavidPostill 그것은 프로그램이 아닌 코드 스 니펫이 아닌가?
Neil

정확한 코드 골프 규칙이 무엇인지 잘 모르겠지만 대부분의 다른 답변도 스 니펫이 아닌가? 그들 대부분은 실행하기 위해 설명의 "쉘"이 필요합니다 ...
DavidPostill

9

Z 셸 (zsh), 15 바이트

<<<${PATH//:/
}

Anarchy Golf 에서 코드를 테스트 할 수 있습니다 . 양식 사용을 클릭하고 zsh를 선택 하고 코드를 붙여넣고 제출하십시오.

배쉬 (순수), 19 바이트

echo "${PATH//:/
}"

같은 생각이지만 Bash의 덜 골칫거리 인 구문이 있습니다. Ideone에서 테스트하십시오 .


6

파워 쉘, 20 바이트

$env:PATH-split':'

편집하다:

  • -2 바이트 꺼짐 @TimmyD 덕분에

늙은:

$env:PATH.split(":")

5

루비, 25 바이트

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

니스, AskUbuntu에 원래의 질문에 대한 내 대답보다 작은 비트 짧은
세르지 Kolodyazhnyy

Ruby 호출을 계산할 필요는 없으며 프로그램 자체 만 계산하면되므로 26 바이트에 불과합니다.
Jordan

@Jordan은 그것을 몰랐습니다. FAQ에 있습니까?
Anwar

@Jordan 투어 자체에 표시됩니다. 편집했습니다. 알려 주셔서 감사합니다
Anwar

1
또한 1 바이트 split ":"split":"또는 split ?:1 바이트로 변경할 수 있습니다 .
Jordan

4

펄, 22 바이트

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

필요 -E하거나 -M5.010실행 :

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

3

Bash + Python, 43 바이트

쉘의 변수 확장을 사용하자. 호출을 제거 os.environ하여 코드와 가져 오기를 줄입니다. 그것은 우리에게 46 바이트를 제공하고, 우리가 43 바이트를 얻기 xnor전에 트릭과 공간을 제거 -c합니다.

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

작은 따옴표 나 백 슬래시가있는 디렉토리가 PATH에 표시되면이 작업이 실패합니다.
Joey Marianer

@JoeyMarianer 파일 이름 / 경로 문자열에 거의 모든 문자가있을 수 있으므로 yes-실패하고 PATH가 '/ dir'1 : / dir2'로 확장되어 python에 형식이 잘못된 명령이 제공됩니다. 백 슬래시는 반드시 실패 할 필요는 없습니다. 문자열 자체의 내용 만 해석합니다. IMHO, 백 슬래시 이스케이프는 일반 사용자의 경로 이름에 나타나지 않아야하므로 99 %의 경우 괜찮습니다. 그러나 동의합니다 –이 경우와 같이 직접 또는 간접적으로 쉘을 다룰 때
마다이 점

3

자바, 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표현에서 등록하고 붙여 넣습니다. 턴 :줄 바꿈에들. 까다로운 일은 없습니다.


그들은 이것을 Vim 튜토리얼에 넣어야합니다. Vim에 들어가는 방법에 대해 읽는 사람은이 예에 감사드립니다.
loa_in_

2

PHP, 36 35 33 32 바이트

Blackhole
덕분에 1 바이트 절약 Martijn 덕분에 사용자 59178 1 바이트 절약 덕분에 2 바이트
절약

* nix 버전

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

Windows 버전

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

1
@ RomanGräf *nix유닉스 계열 시스템 을 나타내는 방법입니다 .
Arnauld

1
"멀티 플랫폼"버전을 원한다면 상수를 사용할 수 있습니다PATH_SEPARATOR
Ismael Miguel

1
사용하지 마십시오 \n,하지만 진정한 뉴 라인 대신에, 그것은 당신에게 한 바이트를 절약 할 수 있습니다.
Blackhole

1
"s를 떨어 뜨릴 수도 있습니다 PATH. "정의되지 않은 상수 사용"알림이 표시되지만 여전히 작동하여 2 바이트를 절약합니다.
user59178

1
짧은 에코를 사용하면 <?=strtr(getenv(PATH),":","")?>바이트가 안전합니다 (* 주석에는 줄 바꿈이 없습니다)
Martijn

2

파이썬 2, 49 바이트

2 저장하면 교체하여 @xnor 1 바이트 덕분 바이트 environgetenv@Serg 및 @Oliver 덕분

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

Python 3의 경우 인수를 추가 (하고 )주변 print에 바이트 수에 1을 추가하십시오.


이것은 어떻게 입력을 얻습니까?
Anwar

2
os.environ [ 'PATH']로부터 @Anwar는 문자열을 반환합니다
Sergiy Kolodyazhnyy

1
@Serg 아. 알았다.
Anwar

2
replace압축 된 인수를 취할 수 있습니다 replace(*':\n').
xnor

3
@KarlNapf Yea, 그게 요점입니다. 이 프로그램은 Python 3에서 실행되지 않으므로 작동하는 버전을 지정해야합니다.
Denker

2

C, 85 84 바이트

사용을위한 -1 바이트 #import

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

1

라켓 39 바이트

@heemayl의 sed 명령 사용 :

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

언 골프 드 :

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

테스트 :
(f)

산출:

/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')

스칼라에서는 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 시스템에서 작동 ;:모노 라이브러리를 사용할 수 추정. ideone 에서 온라인으로 시도하면 .NET Fiddle은 보안 예외를 반환합니다.

또는 전체 C # 프로그램은 다소 장황합니다.


C #, 118 바이트

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

1

하스켈, 72 바이트

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

replace표준 라이브러리 내에서 값 비싼 가져 오기가 없으면 상당히 길어집니다.


반드시 m ':'...그 공간이 필요하지 않습니까?
고양이

1
@cat : '식별자 내에 유효한 문자 이므로 공백이 필수 입니다. 공간이 없으면이라는 함수를 정의합니다 m'.
nimi

1

C (x86), 60 바이트

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

getenvint (32 비트)를 반환 하므로 stdlib.h 를 포함하지 않으면 64 비트 플랫폼에서는 작동하지 않습니다. 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 자신을 char 포인터를 반환하는 함수로 선언 합니다.

나는 이것을 리눅스에서 gcc와 clang으로 테스트했다. 다른 설정으로 인해 피가 울릴 수 있습니다. Ideone에서 사용해보십시오 .


1

인자 , 28 바이트

유닉스 계열의 경우. Windows 상자가 아니기 때문에 Windows에서 수행하는 방법을 모르겠습니다.

"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}

덕분에 :

  • gsub()내장 변수 조작 (7 자) 대신 사용을 제안하는 ninjalj

일반적인 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

도 당신이 맞습니다, @ninjalj. 나는 그것을 awk특정한 방식 으로하는 데 집중해야했다 . 고맙습니다.
manatwork

0

Node.js, 36 바이트

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

꽤 직설적 인.


0

MATLAB, 34 바이트

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

옥타브에서는 두 번째 및 세 번째 입력 이 숫자 값이 아닌 변수 여야 하므로 옥타브 의 온라인 데모 가 약간 수정되었습니다 .strrepchar




0

Gema, 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*-, >

"RAVE"4(환경 변수에 쉽게 액세스하기 위해 EVAR 지문 ( )을 로드하고 PATH envvar ( "HTAP"G)를 가져오고 각 문자에 대해 문자가 "\ 0"( :!k@) 인 경우 프로그램을 종료 하고 char가 ASCII 인 경우 ASCII 48 "0"을 뺍니다. 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="
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.