$ PATH Değişkeni, Satır Satır Dışa Aktar


22

AskUbuntu'daki bu sorudan ilham aldı.

İşin son derece basittir. PATH ortam değişkenini ( echo $PATH) alın ve her girişin ( :karakterle ayrılmış ) kendi satırında olacak şekilde dışa aktarın .

Örneğin, PATH ise /bin:/usr/bin:/usr/local/bin, programınızın çıktısı alınmalıdır:

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

Programınız önde gelen bir yeni satır döndürmeyebilir, ancak sondaki tek satır sonunu döndürebilir. YOLUN doğru olup olmadığını veya dizinin var olup olmadığını kontrol etmeniz gerekmez. Programınız hiçbir girdi almamalı, yani programın PATH'in kendisini almaktan sorumlu olduğu anlamına gelir. PATH içindeki nesnelerin :veya yeni satırlar içermediğini güvenle kabul edebilirsiniz . Ancak, boşluklar adil bir oyundur.

Referans uygulamaları yukarıdaki soruya verilen cevaplarda mevcuttur.

kurallar

  • Bu (açıkçası) kod golfüdür, bu nedenle en kısa cevap yeşil onay işaretini kazanacaktır.
  • Kabul edilen cevap, yasal olduğundan emin olmak için test edilecektir.
  • Hem Windows hem de * nix girişleri kabul edilir.
    • Ancak, açıkça Windows belirtmezseniz, onu Linux'ta çalıştırmayı dener ve başarısız olur. (Açıksa (merhaba, Toplu!), Açıkça belirtmeniz gerekmez.)
  • Cevap başına sadece bir çözüm var. Hem Windows hem de * nix sürümünüz varsa, daha kısa olanı sayarım.
  • İki cevap aynı uzunluğa sahipse, toplam oylama yüksek olana öncelik vereceğim. Toplamda aynı oylamaya sahiplerse, büyük olanı sayarım. Gönderilen süre aynıysa, daha hızlı çalışacak olanı seçeceğim. Aynı sürede idam ederlerse bilmiyorum.

Liderler Sıralaması


Ahh! Bazı golf ipucu vermeden AskUbuntu Soru ziyaret zordu.
Roman Gräf

Bazı (kabuk) cevapları yolun boşluk içermediğini varsayıyor gibi görünmektedir. Düzeltilmeli mi?
Dennis,

@Dennis Tipik olarak, yol değişkeni boşluk içermemelidir, ancak olabildiğince düzeltilmelidir. Bununla birlikte, yolların kendilerinin içermediğini, ya da yeni bir satırın güvenli olduğunu varsayabiliriz.
Kaz Wolfe

Bir fonksiyon kabul edilebilir mi?
corvus_192 16:16

@ corvus_192 Eğer zorluk açıkça aksi belirtilmedikçe, fonksiyonlara izin verilir.
Dennis,

Yanıtlar:


12

Z kabuğu (zsh), 13 bayt

<<<${(F)path}

Kullanım $pathparametre olan kabuk tarafından kullanılan özel bir dizi parametre, bağlı için $PATHparametre ve bir parametre genişletme bayrak yeni satır içeren bir dizi katılması için.


3
Görünüşe biri yapar basitçe golf @Dennis ... Ha.
wizzwizz4

Buna bazı kelimeler nasıl takılır? Denedim alias path="<<<${(F)path}"ama idam edildiğinde baskılar /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/bindevam ediyorsbin
Daniel Springer

@DanielSpringer $ yolu, istemediğiniz takma ad tanımı sırasında genişletiliyor. Bunun yerine tek tırnak kullanın:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction işe yaradı! Neden çift tırnak mi değil çalışıyor?
Daniel Springer,

@DanielSpringe Değil uzay burada bir sürü açıklamak için, burada bir pastebin var: ix.io/1RyW
GammaFunction

13

Bash / Coreutils, 17 16 bayt

tr : '
'<<<$PATH

tr : '\n'<<<$PATHde çalışmalı
Arnauld

Öyle. . . şu an düzenleme
Sergiy Kolodyazhnyy

Sanırım etrafındaki boşlukları da kaldırabilirsin <<<(sadece Ubuntu'da test edildi)
Arnauld

@Bu Ubuntu'nun sadece bir şey olduğunu sanmıyorum, bu bash şey, bu yüzden dağıtıma karşı çalışmalıyım
Sergiy Kolodyazhnyy

6
Herhangi bir bayt kaydetmez, ancak \\nbelirtilen değişken yerine kullanmak daha okunur.
Dennis,

10

Toplu, 41 bayt

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

PATHnoktalı virgülle ayrılmış Windows'ta elbette. Elverişli bir şekilde, fornoktalı virgüllere varsayılan olarak bölünür, ancak rahatsız edici, aynı zamanda boşluklar da böylelikle bölmeden önce her yol öğesini alıntılamak için dize yerine hileler kullanmak zorundayım. Daha sonra tırnak sonradan kaldırmak için kalır.


1
Eğer yerine komut satırından çalıştırma %%ile %2 bayt tasarrufu.
DavidPostill

@DavidPostill Bu bir program yerine kod pasajı yapmaz mı?
Neil

Golf kurallarının tam olarak ne olduğundan emin değilim, ancak diğer cevapların çoğu sadece snippet'lerde değil mi?
Birçoğunun

9

Z kabuğu (zsh), 15 bayt

<<<${PATH//:/
}

Kodu Anarchy Golf'te test edebilirsiniz : kullanım formunu tıklayın , zsh'yi seçin , kodu yapıştırın ve gönderin.

Bash (saf), 19 bayt

echo "${PATH//:/
}"

Aynı fikir, ancak Bash'in daha az golfyen sözdizimi ile. İdeone üzerinde test et .


6

Powershell, 20 bayt

$env:PATH-split':'

Düzenle:

  • -2 bayt kapalı. @TimmyD sayesinde

Eski:

$env:PATH.split(":")

5

Yakut, 25 bayt

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

Güzel, minik AskUbuntu'daki orijinal soruya verdiğim cevabımdan daha kısa
Sergiy Kolodyazhnyy

Ruby çağırmasını saymanıza gerek yok, sadece programın kendisi, yani bu sadece 26 bayttır.
Ürdün

@ Jordan bunu bilmiyordu. SSS'de mi var?
Anwar,

@Jordan Turun kendisi gösterilir. Yani, düzenlenmiş. Bunu söylediğin için teşekkür ederim
Anwar

1
Oh, ayrıca 1 bayt split ":"olarak split":"veya split ?:için değiştirebilirsiniz .
Ürdün

4

Perl, 22 bayt

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

İhtiyaç duyması -Eveya -M5.010çalıştırılması:

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

3

Bash + Python, 43 bayt

Shell'in değişken genişlemesini kullanalım. Çağrıları ortadan kaldırır os.environ, böylece daha az kod ve daha az ithalat. Bu bize 46 byte verir, ve biz de 43 byte'ımız xnorolmadan önce hile ve boşluğu -cbırakarak.

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

PATH'unuzda tek bir alıntı veya ters eğik çizgi bulunan bir dizin belirdiğinde bunun başarısız olduğunu unutmayın.
Joey Marianer,

@JoeyMarianer Dosya adı / yol dizgisinde hemen hemen herhangi bir karakter olabileceğinden, evet - bu başarısız olabilir ve PATH'in python'a yanlış biçimlendirilmiş komut veren '/ dir'1: / dir2' ye genişlemesi gerekir. Ters eğik çizgi mutlaka başarısız olmaz - yalnızca dizenin kendisinde bulunanları yorumlar. IMHO, ters eğik çizgi kaçar normal kullanıcının yol adlarında görünmemelidir, bu nedenle vakaların% 99 için bu Tamam. Bununla birlikte, aynı fikirdeyim - bu, doğrudan veya dolaylı olarak kabuğuyla
Sergiy Kolodyazhnyy

3

Java, 58 bayt

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

Tam program: 106 bayt

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

3

GNU sed+ bash, 25 bayt:

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

Eğer PATHboşluk ile hiçbir dizin adını içeren, hayır, 23 bayt gerekli tırnaklama:

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

Daha kısa, hatta @Dennis: sayesinde newline'e çevriliyor :

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

3

Vim, 19 bayt

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

$PATHİfade yazmacından tut ve yapıştır. :S'yi yeni satırlara çevirin . Hiçbir şey zor değil.


Bunu Vim derslerinde vermeliler. Vim'e nasıl girileceğini okuyan biri olarak bu örneği takdir ediyorum.
loa_in_

2

PHP, 36 35 33 32 bayt

Kaydedilen 1 bayt, Blackhole sayesinde
Kaydedilen 2 bayt, user59178 sayesinde
1 bayt kaydedildi, Martijn sayesinde

* nix sürümü

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

Windows sürümü

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

1
@ RomanGräf *nix, Unix benzeri bir sisteme gönderme yapmanın bir yoludur .
Arnauld,

1
Eğer "çoklu plataform" bir versiyon istiyorsanız, sabiti kullanabilirsinizPATH_SEPARATOR
Ismael Miguel

1
Kullanmayın \n, bunun yerine gerçek bir yeni satır olsun, size bir bayt kazandırır.
Karadelik

1
Ayrıca "s etrafına bırakabilirsiniz PATH. Bir "tanımsız sabit kullanımı" bildirimi alıyorsunuz, ancak 2 bayttan tasarruf ederek hala çalışıyor.
kullanici59178

1
Kısa yankı kullanımı <?=strtr(getenv(PATH),":","")?>bir bayt güvenliğini sağlar (* yorumlarda yeni satır
yazamaz

2

Python 2,49 bayt

@ Xor ve @Oliver environile değiştirilerek @ xnor ve 1 byte sayesinde 2 byte tasarrufgetenv

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

Python 3 için, sadece ekleyebilir (ve )çevresinde printargüman ve bayt sayısına 1 ekleyecektir.


Bu girdiyi nasıl elde edecek?
Anwar,

2
Os.environ'tan @Anwar ['PATH'], bu dizgiye geri dönecek
Sergiy Kolodyazhnyy

1
@Serg ah. anladım.
Anwar,

2
replacepaketlenmiş argümanlar alabilir replace(*':\n').
xnor

3
@KarlNapf Yea, mesele bu. Olduğu gibi bu program Python 3'te çalışmıyor, bu nedenle çalıştığı sürümü belirtmelisiniz.
Denker

2

C, 85 84 bayt

Kullanmak için -1 bayt #import

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

1

Raket 39 bayt

@Heemayl sed komutunu kullanarak:

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

Ungolfed:

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

Test:
(f)

Çıktı:

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

1

Scala, 31 bayt

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

Scala'da, a b csözdizimsel şeker a.b(c), yani busys.env("PATH").replace(':','\n')



1

C #, 64 bayt

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

Yol değişkenini döndüren adsız işlev, her dizin ayrı bir satırda. xBunun kullanmak yerine 1 byte tasarruf etmenin aptalca bir nesne olduğunu unutmayın ().

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

Değiştirmek Ayrıca UNIX sistemleri üzerinde çalışan ;ile :Mono kütüphaneler mevcuttur varsayarsak. İdeone çevrimiçi olarak deneyin , .NET Fiddle bir güvenlik istisnası döndürür.

Alternatif olarak, daha ayrıntılı olan tam bir C # programı:


C #, 118 bayt

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

1

Haskell, 72 bayt

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

Pahalı bir ithalat ve replacestandart kütüphane içinde yok oldukça uzun.


elbette m ':'...o alana ihtiyaç duymuyor mu?
kedi,

1
@ cat: boşluk zorunludur, çünkü 'tanımlayıcılar içinde geçerli bir karakterdir. Boşluk olmadan adlı bir fonksiyon tanımlarız m'.
nimi

1

C (x86), 60 bayt

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

Bu, stdlib.h dahil olmadan 64-bit platformlarda çalışmaz , çünkü getenv bir int (32 bit) döndürürken , char pointerler 64 bit genişliğindedir.

Henüz bir çevrimiçi 32 bit C derleyicisi bulamadım.

C (x86-64), 70 bayt

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

Stdlib.h dosyasını dahil etmek yerine, kendimizi bir char pointer döndüren bir işlev olarak getenv olarak ilan ederiz .

Bunu Linux üzerinde gcc ve clang ile test ettim; diğer kurulumlar kan ağlayabilir. Üzerinde Deneyin Ideone .


1

Faktör , 28 bayt

unix severler için. Windows kutusunda olmadığım için Windows'ta nasıl yapacağımı bilmiyorum.

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

1

jq, 18 karakter

(16 karakter kod + 2 karakter komut satırı seçeneği)

env.PATH/":"|.[]

Örnek çalışma:

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 karakter

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

Sayesinde:

Tipik awkyol awk, verileri otomatik olarak nasıl değiştireceğini etkileyen yerleşik değişkenleri ayarlamaktır :

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

Örnek çalışma:

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

Hamuru. Haklısın, @ ninjalj. Özel bir şekilde yapmaya odaklanmıştım awk. Teşekkür ederim.
Manatwork

0

Node.js, 36 bayt

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

Oldukça yalındır.


0

MATLAB, 34 bayt

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

Burada, Octata'da küçük bir değişiklikle çevrimiçi demo , strrepoktavda ikinci ve üçüncü girdilerin charsayısal değerler yerine değişkenler olmasını gerektiriyor .




0

Gema, 36 karakter

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

Örnek çalışma:

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 parmak izi, 34 bayt

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

"RAVE"4(Ortam değişkenlerine kolayca erişmek için EVAR parmak izini ( ) yükler, PATH envvar ( "HTAP"G) işlevini alır ve karakter "\ 0" ( :!k@) ise her karakter için karakterden çıkar, karakter ASCII 58 ise ASCII 48 "0" karakterini çıkarır. ":" ( :':-!'0*-) ve karakteri ( ,) çıkarır .


0

ELF / x86, 78 bayt

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 kaynağı:

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="
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.