ส่งออกตัวแปร $ PATH แบบทีละบรรทัด


22

แรงบันดาลใจจากคำถามนี้ใน AskUbuntu

งานของคุณง่ายมาก ใช้ตัวแปรสภาพแวดล้อม PATH ( echo $PATH) และส่งออกโดยที่แต่ละรายการ (คั่นด้วย:อักขระ) อยู่ในบรรทัดของตัวเอง

ตัวอย่างเช่นหาก PATH เป็น/bin:/usr/bin:/usr/local/binโปรแกรมของคุณควรส่งออก:

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

โปรแกรมของคุณอาจไม่คืนบรรทัดใหม่ที่นำหน้า แต่อาจส่งคืนบรรทัดใหม่ที่ต่อท้ายหนึ่งบรรทัด คุณไม่จำเป็นต้องตรวจสอบว่า PATH นั้นถูกต้องหรือมีไดเรกทอรีอยู่หรือไม่ โปรแกรมของคุณไม่ควรป้อนข้อมูลซึ่งหมายความว่าโปรแกรมของคุณรับผิดชอบการรับเส้นทางเอง คุณอาจสันนิษฐานได้อย่างปลอดภัยว่าวัตถุใน PATH ไม่มี:หรือขึ้นบรรทัดใหม่ อย่างไรก็ตามช่องว่างเป็นเกมที่ยุติธรรม

การใช้งานอ้างอิงอยู่ในคำตอบของคำถามข้างต้น

กฎระเบียบ

  • นี่คือรหัสกอล์ฟแน่นอนว่าคำตอบที่สั้นที่สุดจะชนะเครื่องหมายถูกสีเขียว
  • คำตอบที่ยอมรับจะถูกทดสอบเพื่อให้แน่ใจว่าเป็นจริง
  • ยอมรับทั้งรายการ Windows และ * nix
    • อย่างไรก็ตามหากคุณไม่ได้ระบุ Windows อย่างชัดเจนฉันจะลองใช้งานใน Linux และล้มเหลว (หากเป็นที่ชัดเจน (สวัสดีแบทช์!) คุณไม่จำเป็นต้องระบุอย่างชัดเจน)
  • มีคำตอบเดียวเท่านั้นต่อคำตอบ หากคุณมีทั้งรุ่น Windows และ * nix ฉันจะนับรุ่นที่สั้นกว่า
  • หากคำตอบทั้งสองมีความยาวเท่ากันฉันจะให้ความสำคัญกับคำตอบที่มีคะแนนรวมสูงกว่า หากพวกเขามีคะแนนรวมกันฉันจะนับคะแนนที่เก่ากว่า หากเวลาที่โพสต์เหมือนกันฉันจะเลือกเวลาที่ดำเนินการได้เร็วขึ้น หากพวกเขาดำเนินการในระยะเวลาเดียวกันฉันไม่รู้

ลีดเดอร์บอร์ด


อ่า! มันยากที่จะเยี่ยมชม AskUbuntu คำถามโดยไม่ต้องให้ทิปกอล์ฟ
Roman Gräf

คำตอบ (เชลล์) บางคำดูเหมือนว่าจะถือว่าเส้นทางไม่มีช่องว่าง พวกเขาควรได้รับการแก้ไข?
Dennis

@Dennis โดยปกติแล้วตัวแปรพา ธ ไม่ควรมีช่องว่าง แต่ควรแก้ไขให้ถูกต้อง อย่างไรก็ตามเราสามารถสันนิษฐานได้ว่าเส้นทางนั้นไม่มี: หรือขึ้นบรรทัดใหม่
Kaz Wolfe

ฟังก์ชั่นเป็นที่ยอมรับหรือไม่?
corvus_192

@ corvus_192 เว้นแต่ความท้าทายจะระบุไว้เป็นอย่างอื่นอย่างชัดเจนอนุญาตให้ใช้ฟังก์ชันได้
เดนนิส

คำตอบ:


12

Z shell (zsh), 13 ไบต์

<<<${(F)path}

ใช้$pathพารามิเตอร์ซึ่งเป็นพารามิเตอร์อาร์เรย์พิเศษที่ใช้โดยเชลล์ที่เชื่อมโยงกับ$PATHพารามิเตอร์และแฟล็กการขยายพารามิเตอร์เพื่อเข้าร่วมอาร์เรย์ที่มีบรรทัดใหม่


3
เห็นได้ชัดว่าอย่างใดอย่างหนึ่งไม่เพียงออกกอล์ฟ @ เดนนิส ...
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
Daniel Springer

@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

ฉันคิดว่าคุณสามารถลบช่องว่างออกได้<<<เช่นกัน (ทดสอบบน Ubuntu เท่านั้น)
Arnauld

@Arnauld ฉันไม่คิดว่ามันเป็นเพียงอูบุนตูมันเป็นสิ่งที่น่ารังเกียจดังนั้นควรทำงานข้าม distros
Sergiy Kolodyazhnyy

6
มันไม่ได้บันทึกไบต์ใด ๆ แต่การใช้\\nแทนตัวแปรที่ยกมาเป็น imho อ่านได้มากขึ้น
Dennis

10

แบตช์ 41 ไบต์

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

PATHแน่นอนคั่นด้วยเครื่องหมายอัฒภาคใน Windows แน่นอน สะดวกforแยกเซมิโคลอนตามค่าเริ่มต้น แต่ไม่สะดวกเช่นกันในช่องว่างดังนั้นฉันต้องใช้สตริงแทนที่เล่ห์เหลี่ยมเพื่ออ้างอิงองค์ประกอบของแต่ละเส้นทางก่อนที่จะแยก จากนั้นจะยังคงลบเครื่องหมายคำพูดในภายหลัง


1
ทำงานจากบรรทัดคำสั่งคุณสามารถแทนที่%%ด้วย%การบันทึก 2 ไบต์
DavidPostill

@DavidPostill นั่นจะไม่ทำให้เป็นข้อมูลโค้ดแทนที่จะเป็นโปรแกรมใช่ไหม
Neil

ฉันไม่แน่ใจว่ากฎกอล์ฟของรหัสที่แน่นอนคืออะไร แต่คำตอบอื่น ๆ ส่วนใหญ่ไม่ใช่แค่ตัวอย่างเท่านั้น ส่วนใหญ่ของพวกเขาต้องการ "เชลล์" ของคำอธิบายบางอย่างเพื่อให้ทำงาน ...
DavidPostill

9

Z shell (zsh), 15 ไบต์

<<<${PATH//:/
}

คุณสามารถทดสอบรหัสบนAnarchy Golf : คลิกใช้แบบฟอร์มเลือกzshวางรหัสแล้วส่ง

Bash (บริสุทธิ์), 19 ไบต์

echo "${PATH//:/
}"

แนวคิดเดียวกัน แต่มีไวยากรณ์น้อยกว่าของ Bash ทดสอบบนIdeone



5

Ruby, 25 ไบต์

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

ดีเล็กน้อยสั้นกว่าคำตอบของฉันในคำถามต้นฉบับใน AskUbuntu
Sergiy Kolodyazhnyy

คุณไม่จำเป็นต้องนับการร้องขอ Ruby เฉพาะโปรแกรมเท่านั้นดังนั้นจึงมีขนาดเพียง 26 ไบต์
Jordan

@Jordan ไม่รู้ว่า มันอยู่ในคำถามที่พบบ่อย?
อันวาร์

@ จอร์แดนมันแสดงให้เห็นในทัวร์ของตัวเอง ดังนั้นแก้ไข ขอบคุณที่บอกว่า
Anwar

1
โอ้คุณสามารถเปลี่ยนsplit ":"เป็นsplit":"หรือsplit ?:1 ไบต์
Jordan

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 ของคุณ
Joey Marianer

@JoeyMarianer เนื่องจากสามารถมีอักขระได้เกือบทุกตัวในชื่อไฟล์ / พา ธ สตริงดังนั้นใช่ - สิ่งนี้อาจล้มเหลวและเนื่องจาก PATH จะขยายเป็น '/ dir'1: / dir2' ซึ่งให้คำสั่งที่จัดรูปแบบไม่ถูกต้องเป็นไพ ธ อน แบ็กสแลชไม่จำเป็นต้องล้มเหลว - เพียงตีความสิ่งที่อยู่ในสายอักขระ IMHO เครื่องหมายแบคสแลชจะไม่ปรากฏในชื่อพา ธ ของผู้ใช้ปกติดังนั้นสำหรับ 99% ของกรณีนี้ก็ใช้ได้ ฉันเห็นด้วย - ควรเก็บไว้ในใจตลอดเวลาที่คุณจัดการกับเปลือกโดยตรงหรือโดยอ้อมในกรณีนี้
Sergiy Kolodyazhnyy

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

เป็นกลุ่ม, 19 ไบต์

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

หยิบ$PATHจากนิพจน์รีจิสเตอร์และวาง เปลี่ยน:s เป็น newlines ไม่มีอะไรยุ่งยาก


พวกเขาควรจะใส่สิ่งนี้ในแบบฝึกหัด Vim ในขณะที่บางคนกำลังอ่านเกี่ยวกับวิธีการเป็นกลุ่มฉันขอขอบคุณตัวอย่างนี้
loa_in_

2

PHP, 36 35 33 32 ไบต์

บันทึก 1 ไบต์ขอบคุณ Blackhole
บันทึก 2 ไบต์ขอบคุณ user59178
บันทึก 1 ไบต์ขอบคุณ Martijn

* รุ่นที่ห้ามใช้

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

รุ่นของ Windows

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

1
@ RomanGräf *nixเป็นเพียงวิธีการหมายถึงเป็นUnix เหมือนระบบ
Arnauld

1
หากคุณต้องการรุ่น "multi-plataform" คุณสามารถใช้ค่าคงที่PATH_SEPARATOR
Ismael Miguel

1
อย่าใช้\nแต่ขึ้นบรรทัดใหม่จริงมันจะช่วยให้คุณประหยัดหนึ่งไบต์
Blackhole

1
คุณยังสามารถวาง"s PATHรอบ คุณได้รับการแจ้งเตือน "ใช้ค่าคงที่ที่ไม่ได้กำหนด" แต่ก็ยังใช้งานได้ช่วยให้คุณประหยัดได้ 2 ไบต์
user59178

1
การใช้ echo สั้นปลอดภัย<?=strtr(getenv(PATH),":","")?>หนึ่งไบต์ (* ไม่สามารถขึ้นบรรทัดใหม่ในความคิดเห็น)
Martijn

2

Python 2, 49 ไบต์

ประหยัด 2 ไบต์ด้วย @xnor และ 1 ไบต์โดยแทนที่environด้วยgetenv@Serg และ @Oliver

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

สำหรับ Python 3 เพียงแค่เพิ่ม(และ)ล้อมรอบprintอาร์กิวเมนต์และเพิ่ม 1 ไปยังจำนวนไบต์


How will this get the input?
Anwar

2
@Anwar from os.environ['PATH'] , that will return the string
Sergiy Kolodyazhnyy

1
@Serg ah. got it.
Anwar

2
replace can take packed arguments replace(*':\n').
xnor

3
@KarlNapf Yea, thats the point. This program as-is does not run in Python 3, so you should specify the version it works with.
Denker


1

Racket 39 bytes

Using sed command of @heemayl :

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

Ungolfed:

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

Testing:
(f)

Output:

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



1

C#, 64 bytes

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

Anonymous function which returns the path variable, each directory on a separate line. Note that x is just a dummy object to save 1 byte instead of using ().

Full program:

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));
        }
    }
}

Also works on UNIX systems if you replace ; with :, presuming Mono libraries are available. Try it online on ideone, .NET Fiddle returns a security exception.

Alternatively, a full C# program, which is rather verbose:


C#, 118 bytes

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

1

Haskell, 72 bytes

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

An expensive import and no replace within the standard library make it quite long.


surely m ':'... doesn't need that space?
cat

1
@cat: the space is mandatory, because ' is a valid character within identifiers. Without space we'd define a function named m'.
nimi

1

C (x86), 60 bytes

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

This won't work on 64-bit platforms without including stdlib.h, since getenv returns an int (32 bits) while char pointers are 64 bits wide.

I have yet to find an online 32-bit C compiler.

C (x86-64), 70 bytes

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

Instead of including stdlib.h, we declare getenv ourselves as a function returning a char pointer.

I've tested this with gcc and clang on Linux; other setups may cry blood. Try it on Ideone.



1

jq, 18 characters

(16 characters code + 2 characters command line option)

env.PATH/":"|.[]

Sample run:

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 characters

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

Thanks to:

  • ninjalj for suggesting to use gsub() instead of manipulating built-in variables (-7 characters)

The typical awk way would be to set up the built-in variables which influences how awk manipulates the data automatically:

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

Sample run:

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. You are right, @ninjalj. I was to focused on doing it in awk-specific way. Thank you.
manatwork


0

MATLAB, 34 bytes

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

Here is an online demo in Octave with a slight modification since strrep in octave requires the second and third inputs to be char variables rather than numeric values.




0

Gema, 36 characters

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

Sample run:

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 fingerprint, 34 bytes

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

Loads the EVAR fingerprint ("RAVE"4() to easily access environment variables, gets the PATH envvar ("HTAP"G), and for each character, exits the program if the character is "\0" (:!k@), substracts ASCII 48 "0" if the char is ASCII 58 ":" (:':-!'0*-), and outputs the character (,).


0

ELF/x86, 78 bytes

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 source:

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.