$ 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で実行しようとして失敗します。(明らかな場合(こんにちは、バッチ!)、明示的に指定する必要はありません。)
  • 回答ごとに1つのソリューションのみがあります。Windowsと* nixの両方のバージョンがある場合は、短い方を数えます。
  • 2つの回答の長さが同じである場合、合計投票数の多い方を優先します。彼らが同じ票の合計を持っている場合、私は古いものを数えます。投稿された時間が同じ場合、より高速に実行されるものを選択します。同じ時間で実行される場合、私は知りません。

リーダーボード


ああ!ゴルフのヒントを与えずにAskUbuntuの質問にアクセスすることは困難でした。
ローマングラフ

(シェル)回答の中には、パスにスペースが含まれていないことを前提としているようです。それらを修正する必要がありますか?
デニス

@Dennis通常、パス変数にスペースを含めることはできませんが、できる限り修正する必要があります。ただし、パス自体には:や改行は含まれないと想定しても安全です。
カズウルフ

機能は受け入れられますか?
corvus_192

挑戦がない限り@ corvus_192 明示的にそう言って、機能が許可されています。
デニス

回答:


12

Zシェル(zsh)、13バイト

<<<${(F)path}

使用$pathパラメータされたシェルで使用される特殊な配列パラメータである、結ば$PATHパラメータ、及びパラメータ展開フラグ改行を持つ配列を結合することを。


3
どうやら1はありません @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!二重引用符機能しなかったのはなぜですか?
ダニエルスプリンガー


13

Bash / Coreutils、17 16バイト

tr : '
'<<<$PATH

tr : '\n'<<<$PATH同様に動作するはずです
アーナルド

します 。。。編集中
Sergiy Kolodyazhnyy

周りのスペースも削除できると思います<<<(Ubuntuでのみテスト済み)
Arnauld

私はUbuntuの唯一の事、それのbashのことだとは思わないので、ディストリビューションaccross動作するはず@Arnauld
Sergiy Kolodyazhnyy

6
バイトは保存されません\\nが、引用符で囲まれた変数の代わりに使用する方が読みやすいです。
デニス

10

バッチ、41バイト

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

PATHもちろん、Windowsではセミコロンで区切られています。便利なことに、forデフォルトではセミコロンで分割されますが、不便なことにスペースでも分割されるため、分割する前に文字列置換トリックを使用して各パス要素を引用する必要があります。その後、引用符を削除するために残ります。


1
あなたは置き換えることができ、コマンドラインから実行する%%%2つのバイトを保存します。
DavidPostill

@DavidPostillそれはプログラムではなくコードスニペットになりませんか?
ニール

私は正確なコードのゴルフ規則が何であるかわかりませんが、他の答えのほとんどもスニペットだけではありませんか?それらのほとんどは実行するために、いくつかの説明の「シェル」...必要
DavidPostill

9

Zシェル(zsh)、15バイト

<<<${PATH//:/
}

Anarchy Golfでコードをテストできます。[ フォームを使用 ]をクリックしてzshを選択し、コードを貼り付けて送信します。

Bash(純粋)、19バイト

echo "${PATH//:/
}"

同じ考えですが、Bashのゴルフのようなシンタックスは少ないです。Ideoneでテストします。



5

ルビー、25バイト

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

素晴らしく、AskUbuntuの元の質問に対する私の答えよりも少し短い
Sergiy Kolodyazhnyy

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バイトが得られます。また、43バイトになるxnor前に、「トリックとスペースの削除-c」が行われます。

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

PATHに一重引用符またはバックスラッシュを含むディレクトリが表示される場合、これは失敗することに注意してください。
ジョーイマリアナー

@JoeyMarianerファイル名/パス文字列にはほとんどすべての文字が含まれている可能性があるため、そうです-これは失敗する可能性があり、PATHが '/ dir'1:/ dir2'に展開され、Pythonに誤ってフォーマットされたコマンドを与えます。バックスラッシュは必ずしも失敗するわけではありません-文字列自体の内容を解釈するだけです。私見、バックスラッシュエスケープは通常のユーザーのパス名に表示されるべきではないため、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

Vim、19バイト

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

$PATH式レジスタから取得して貼り付けます。ターン:改行に秒。難しいことは何もありません。


彼らはこれをVimチュートリアルに入れるべきです。Vimに入る方法について読んでいる人として、この例を高く評価しています。
loa_in_

2

PHP、36 35 33 32バイト

Blackholeの
おかげで1バイトを保存、Martijnのおかげで2バイトを保存、user59178のおかげで
1バイトを保存

* nixバージョン

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

Windows版

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

1
@RomanGräf *nixは、Unixライクなシステムを参照する方法にすぎません。
アーナルド

1
あなたは「マルチ厚底」バージョンをしたい場合は、定数を使用することができますPATH_SEPARATOR
イスマエル・ミゲル

1
を使用せず\n、代わりに真の改行を使用すると、1バイト節約できます。
ブラックホール

1
"sをドロップすることもできますPATH。「未定義の定数の使用」という通知を受け取りますが、それでも機能し、2バイト節約されます。
user59178

1
ショートエコーを使用すると、<?=strtr(getenv(PATH),":","")?>1バイトが安全になります(*コメントに改行を追加できません)
-Martijn

2

Python 2、49バイト

2保存すると置き換えることにより@xnorと1バイトのおかげバイトenvirongetenv@Sergと@Oliverおかげ

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

Pythonの3のために、単に追加(し、)周りのprint引数とバイト数に1を追加します。


これはどのように入力を取得しますか?
アンワル

2
@Anwar os.environ ['PATH']から、文字列を返します
Sergiy Kolodyazhnyy

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バイト

@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

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

また、に置き換えた場合、Monoライブラリが利用可能;である:と仮定して、UNIXシステムでも動作します。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'
nimi

1

C(x86)、60バイト

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

getenvint(32ビット)を返しますが、charポインターは64ビット幅なので、これはstdlib.hを含まない64ビットプラットフォームでは機能しません。

オンラインの32ビットCコンパイラをまだ見つけていません。

C(x86-64)、70バイト

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

stdlib.hインクルードする代わりに、charポインターを返す関数としてgetenvを宣言します。

Linuxのgccとclangでこれをテストしました。他の設定では、血液が泣く場合があります。Ideoneで試してみてください。


1

ファクター、28バイト

UNIXライク用。私は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特定の方法で行うことに焦点を合わせていました。ありがとうございました。
マナトワーク


0

MATLAB、34バイト

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

ここにあるオンラインデモので、若干の修正とオクターブではstrrepオクターブであることを第二と第三の入力を必要としchar、変数ではなく数値。




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@)、文字がASCIIの場合はASCII 48「0」を減算「:」(:':-!'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.