Exportieren Sie die Variable $ PATH Zeile für Zeile

22

Inspiriert von dieser Frage auf AskUbuntu.

Ihre Arbeit ist sehr einfach. Nehmen Sie die Umgebungsvariable PATH ( echo $PATH) und exportieren Sie sie so, dass jeder Eintrag (durch das :Zeichen getrennt) in einer eigenen Zeile steht.

Wenn beispielsweise der Pfad ist /bin:/usr/bin:/usr/local/bin, sollte Ihr Programm Folgendes ausgeben:

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

Ihr Programm gibt möglicherweise keine führende neue Zeile zurück, aber möglicherweise eine einzelne nachfolgende neue Zeile. Sie müssen nicht überprüfen, ob der Pfad richtig ist oder ob das Verzeichnis existiert. Ihr Programm sollte keine Eingaben machen, was bedeutet, dass Ihr Programm dafür verantwortlich ist, den PFAD selbst zu erhalten. Sie können davon ausgehen, dass Objekte im PATH keine :Zeilenumbrüche enthalten . Räume sind jedoch Freiwild.

Referenzimplementierungen sind in den Antworten auf die obige Frage enthalten.

Regeln

  • Dies ist (offensichtlich) Codegolf, sodass die kürzeste Antwort das preisgekrönte grüne Häkchen gewinnt.
  • Die akzeptierte Antwort wird getestet, um sicherzustellen, dass sie tatsächlich legitim ist.
  • Sowohl Windows- als auch * nix-Einträge werden akzeptiert.
    • Wenn Sie Windows jedoch nicht explizit angeben, werde ich versuchen, es unter Linux auszuführen, und es schlägt fehl. (Wenn es offensichtlich ist (hi, Batch!), Müssen Sie nicht explizit angeben.)
  • Nur eine Lösung pro Antwort. Wenn Sie sowohl eine Windows- als auch eine * nix-Version haben, zähle ich die kürzere.
  • Wenn zwei Antworten gleich lang sind, gebe ich der mit der höheren Stimmenzahl den Vorrang. Wenn sie die gleiche Stimmenzahl haben, zähle ich die ältere. Wenn die angegebene Zeit gleich ist, wähle ich die, die schneller ausgeführt wird. Ob sie in der gleichen Zeit ausgeführt werden, weiß ich nicht.

Bestenliste

Kaz Wolfe
quelle
Ahh! Es war schwer, die AskUbuntu-Frage zu besuchen, ohne ein paar Golftipps zu geben.
Roman Gräf
Einige der (Shell-) Antworten scheinen davon auszugehen, dass der Pfad keine Leerzeichen enthält. Sollten sie korrigiert werden?
Dennis
@Dennis Normalerweise sollte die Pfadvariable keine Leerzeichen enthalten, sie sollten jedoch korrigiert werden, da dies möglich ist. Wir können jedoch davon ausgehen, dass Pfade selbst nicht enthalten: oder eine neue Zeile.
Kaz Wolfe
Ist eine Funktion akzeptabel?
corvus_192
@ corvus_192 Sofern in der Aufforderung nicht ausdrücklich anders angegeben, sind Funktionen zulässig.
Dennis

Antworten:

12

Z-Shell (zsh), 13 Bytes

<<<${(F)path}

Verwendet den $pathParameter , einen speziellen Array-Parameter, der von der an den Parameter gebundenen Shell verwendet wird $PATH, und ein Parametererweiterungsflag , um ein Array mit Zeilenumbrüchen zu verbinden.

Meilen
quelle
3
Offenbar eine tut einfach out-Golf @ Dennis ... Huh.
wizzwizz4
Wie kann man ein Wort dazu aliasieren? Ich habe es versucht, alias path="<<<${(F)path}"aber wenn es ausgeführt wird, /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/bindann geht es ansbin
Daniel Springer
@DanielSpringer $ path wird während der Aliasdefinition erweitert, was Sie nicht möchten. Verwenden Sie stattdessen einfache Anführungszeichen:alias path='<<<${(F)path}'
GammaFunction
@ GammaFunction das hat funktioniert! Warum haben doppelte Anführungszeichen nicht funktioniert?
Daniel Springer
@DanielSpringe Hier ist nicht viel Platz zum Erklären, hier ist ein Pastebin: ix.io/1RyW
GammaFunction
13

Bash / Coreutils, 17 bis 16 Bytes

tr : '
'<<<$PATH
Sergiy Kolodyazhnyy
quelle
tr : '\n'<<<$PATHsollte auch funktionieren
Arnauld
Es tut . . . Bearbeitung im
Moment
Ich denke, Sie können die Leerzeichen auch entfernen <<<(nur auf Ubuntu getestet)
Arnauld
@Arnauld Ich glaube nicht, dass das Ubuntu-Einzige ist, es ist eine Bash-Sache, also sollte es in den Distributionen funktionieren
Sergiy Kolodyazhnyy
6
Es werden keine Bytes \\ngespeichert , aber die Verwendung anstelle der angegebenen Variablen ist imho besser lesbar.
Dennis
10

Batch, 41 Bytes

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

PATHist unter Windows natürlich durch Semikolons getrennt. Praktischerweise forwird standardmäßig auf Semikolons aufgeteilt, aber unpraktisch auch auf Leerzeichen. Daher muss ich das Ersetzen von Zeichenfolgen verwenden, um jedes Pfadelement vor dem Aufteilen in Anführungszeichen zu setzen. Es bleibt dann übrig, die Anführungszeichen danach zu entfernen.

Neil
quelle
1
Ausführen von der Befehlszeile Sie ersetzen können %%mit %Speichern 2 Byte.
DavidPostill
@DavidPostill Wäre das nicht eher ein Code-Snippet als ein Programm?
Neil
Ich bin mir nicht sicher, wie die genauen Code-Golfregeln lauten, aber sind die meisten anderen Antworten nicht auch nur Schnipsel? Die meisten von ihnen benötigen eine "Shell" mit einer Beschreibung, um zu laufen ...
DavidPostill
9

Z-Shell (zsh), 15 Bytes

<<<${PATH//:/
}

Sie können den Code auf Anarchy Golf testen : Klicken Sie auf Formular verwenden , wählen Sie zsh aus , fügen Sie den Code ein und senden Sie ihn ab.

Bash (rein), 19 Bytes

echo "${PATH//:/
}"

Dieselbe Idee, aber mit Bashs weniger golfiger Syntax. Teste es auf Ideone .

Dennis
quelle
6

Powershell, 20 Bytes

$env:PATH-split':'

Bearbeiten:

  • -2 Bytes aus. Vielen Dank an @TimmyD

Alt:

$env:PATH.split(":")
Roman Gräf
quelle
5

Ruby, 25 Bytes

puts ENV["PATH"].split":"
Anwar
quelle
Schön, ein bisschen kürzer als meine Antwort auf die ursprüngliche Frage auf AskUbuntu
Sergiy Kolodyazhnyy
Sie müssen den Ruby-Aufruf nicht zählen, sondern nur das Programm selbst. Das sind also nur 26 Bytes.
Jordanien
@ Jordan wusste das nicht. Ist es in FAQ?
Anwar
@ Jordan Es ist in der Tour selbst gezeigt. Also bearbeitet. Vielen Dank, dass Sie das gesagt haben
Anwar
1
Oh, Sie können auch split ":"zu split":"oder split ?:für 1 Byte wechseln .
Jordanien
4

Perl, 22 Bytes

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

Bedürfnisse -Eoder -M5.010zu laufen:

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

Bash + Python, 43 Bytes

Verwenden wir die variable Expansion der Shell. Es entfällt das Aufrufen os.environ, somit weniger Code und weniger Importe. Das gibt uns 46 Bytes, und mit xnor's Trick und Entfernen von Speicherplatz, bevor -cwir 43 Bytes haben.

python -c"print('$PATH'.replace(*':\n'))"
Sergiy Kolodyazhnyy
quelle
Beachten Sie, dass dies fehlschlägt, wenn in Ihrem PATH ein Verzeichnis mit einem einfachen Anführungszeichen oder einem Backslash angezeigt wird.
Joey Marianer
@JoeyMarianer Da fast jedes Zeichen in Dateiname / Pfadzeichenfolge enthalten sein kann, kann dies fehlschlagen, da PATH zu '/ dir'1: / dir2' erweitert wird, was Python einen falsch formatierten Befehl gibt. Der Backslash muss nicht unbedingt fehlschlagen - er interpretiert nur, was in der Zeichenfolge selbst enthalten ist. Nach meinem Dafürhalten sollten Backslash-Escape-Zeichen nicht in den Pfadnamen normaler Benutzer erscheinen. In 99% der Fälle ist dies in Ordnung. Ich stimme jedoch zu - dies sollte immer beachtet werden, wenn Sie sich direkt oder indirekt mit Shell befassen, wie in diesem Fall
Sergiy Kolodyazhnyy,
3

Java, 58 Bytes

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

Volles Programm: 106 Bytes

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

GNU sed+ bash, 25 Bytes:

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

Wenn der PATHkeine Verzeichnisnamen mit Leerzeichen enthält, keine Anführungszeichen erforderlich, 23 Bytes:

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

Noch kürzer, :dank @Dennis in Newline umwandelnd :

sed y/:/\\n/<<<"$PATH"
heemayl
quelle
3

Vim, 19 Bytes

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

Entnehmen Sie $PATHdem Ausdrucksregister und fügen Sie es ein. :Verwandle das s in Zeilenumbrüche. Nichts kniffliges.

udioica
quelle
Sie sollten dies in Vim-Tutorials einfügen. Als jemand, der liest, wie man in Vim kommt, schätze ich dieses Beispiel.
loa_in_
2

PHP, 36 35 33 32 Bytes

1 Byte gespeichert, dank Blackhole
2 Byte gespeichert , dank User59178
1 Byte gespeichert, dank Martijn

* nix version

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

Windows-Version

<?=strtr(getenv(PATH),";","
")?>
Arnauld
quelle
1
@ RomanGräf *nixist nur eine Möglichkeit, sich auf ein Unix-ähnliches System zu beziehen .
Arnauld
1
Wenn Sie eine "Multi-Plattform" -Version möchten, können Sie die KonstantePATH_SEPARATOR
Ismael Miguel
1
Verwenden Sie nicht \n, sondern eine echte Newline, um ein Byte zu sparen.
Blackhole
1
Sie können das "s auch herum fallen lassen PATH. Sie erhalten den Hinweis "Verwendung undefinierter Konstanten", der jedoch weiterhin funktioniert und Ihnen 2 Byte spart.
user59178
1
Die Verwendung des kurzen Echos <?=strtr(getenv(PATH),":","")?>sichert ein Byte (* in Kommentaren kann kein Zeilenumbruch erfolgen)
Martijn
2

Python 2, 49 Bytes

Sparen von 2 Bytes dank @xnor und 1 Byte durch Ersetzen environdurch getenvdank @Serg und @Oliver

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

Fügen Sie für Python 3 einfach (und )um das printArgument herum 1 zur Byteanzahl hinzu.

Karl Napf
quelle
Wie erhält das die Eingabe?
Anwar
2
@Anwar von os.environ ['PATH'], der den String
zurückgibt
1
@ Serg ah. Ich habs.
Anwar
2
replacekann gepackte Argumente nehmen replace(*':\n').
15.
3
@ KarlNapf Ja, das ist der Punkt. Dieses Programm wird nicht in Python 3 ausgeführt. Geben Sie daher die Version an, mit der es funktioniert.
Denker
2

C, 85 84 Bytes

-1 Byte für die Verwendung #import

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

Schläger 39 Bytes

Mit sed Befehl von @heemayl:

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

Ungolfed:

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

Prüfung:
(f)

Ausgabe:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t
rnso
quelle
1

Scala, 31 Bytes

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

In Scala a b cist syntaktischer Zucker für a.b(c), so dass dieser kompiliert wirdsys.env("PATH").replace(':','\n')

corvus_192
quelle
1

Perl 6 ,  28 25  24 Bytes

%*ENV<PATH>.split(':')».put
put %*ENV<PATH>~~tr/:/\n/
put %*ENV<PATH>~~tr/:/
/
Brad Gilbert b2gills
quelle
1

C #, 64 Bytes

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

Anonyme Funktion, die die Pfadvariable zurückgibt, wobei sich jedes Verzeichnis in einer separaten Zeile befindet. Beachten Sie, dass dies xnur ein Dummy-Objekt ist, um 1 Byte zu speichern, anstatt es zu verwenden ().

Volles Programm:

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

Funktioniert auch auf UNIX - Systemen , wenn Sie ersetzen ;mit :, vorausgesetzt Mono Bibliotheken verfügbar sind. Probieren Sie es online auf ideone aus . .NET Fiddle gibt eine Sicherheitsausnahme zurück.

Alternativ ein vollständiges C # -Programm, das ziemlich ausführlich ist:


C #, 118 Bytes

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

Haskell, 72 Bytes

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

Ein teurer Import und nein replaceinnerhalb der Standardbibliothek machen es ziemlich lang.

nimi
quelle
m ':'...braucht diesen platz sicher nicht?
Katze
1
@cat: Das Leerzeichen ist obligatorisch, da 'es sich um ein gültiges Zeichen in Bezeichnern handelt. Ohne Leerzeichen würden wir eine Funktion namens definieren m'.
Nimi
1

C (x86), 60 Bytes

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

Dies funktioniert nicht auf 64-Bit-Plattformen ohne die Angabe von stdlib.h , da getenv einen int zurückgibt (32 Bits) , während char - Zeiger sind 64 Bit breit.

Ich habe noch keinen 32-Bit-C-Online-Compiler gefunden.

C (x86-64), 70 Bytes

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

Anstatt stdlib.h einzuschließen , deklarieren wir getenv als eine Funktion, die a zurückgibt char - Zeiger.

Ich habe das mit gcc getestet und unter Linux geklingelt. andere Setups können Blut schreien. Probieren Sie es auf Ideone .

Dennis
quelle
1

Faktor 28 Bytes

für unix-likes. Ich weiß nicht, wie ich es unter Windows machen soll, da ich nicht an einer Windows-Box bin.

"PATH"getenv ":" "\n"replace
Katze
quelle
1

jq, 18 Zeichen

(16 Zeichen Code + 2 Zeichen Befehlszeilenoption)

env.PATH/":"|.[]

Probelauf:

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
Mann bei der Arbeit
quelle
1

Awk, 51 44 Zeichen

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

Dank an:

  • ninjalj für den Vorschlag, gsub()eingebaute Variablen (-7 Zeichen) zu verwenden, anstatt sie zu manipulieren

Der typische awkWeg wäre, die eingebauten Variablen einzurichten, die beeinflussen, wie awkdie Daten automatisch manipuliert werden:

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

Probelauf:

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
Mann bei der Arbeit
quelle
Doh. Du hast recht, @ninjalj. Ich sollte mich darauf konzentrieren, es auf eine bestimmte awkWeise zu tun . Vielen Dank.
Manatwork
0

Node.js, 36 Bytes

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

Ziemlich einfach.

Huntro
quelle
0

MATLAB, 34 Bytes

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

Hier ist eine Online-Demo in Octave mit einer geringfügigen Änderung, da strrepin Octave die zweiten und dritten Eingaben charVariablen und keine numerischen Werte sein müssen.

Suever
quelle
0

Groovy, 43 Bytes

System.env['PATH'].replaceAll(":","\n")​​​​
Magische Kraken-Urne
quelle
0

Gema, 36 Zeichen

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

Probelauf:

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
Mann bei der Arbeit
quelle
0

Befunge-98 + EVAR-Fingerabdruck, 34 Bytes

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

Lädt den EVAR-Fingerabdruck ( "RAVE"4(), um auf Umgebungsvariablen leicht zugreifen zu können, ruft den Pfad envvar ( "HTAP"G) ab und beendet das Programm für jedes Zeichen, wenn das Zeichen "\ 0" ( :!k@) ist, subtrahiert ASCII 48 "0", wenn das Zeichen ASCII 58 ist ":" ( :':-!'0*-) und gibt das Zeichen ( ,) aus.

Ninjalj
quelle
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-Quelle:

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="
Ninjalj
quelle