কীভাবে $ PATH এ পাথগুলি আলাদাভাবে প্রদর্শন করবেন


45

আমি $PATHআলাদা করে কীভাবে বিভিন্ন পাথগুলি তালিকাভুক্ত করব তা বুঝতে পারি না যাতে এগুলি দেখতে দেখতে:

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

প্রভৃতি

কেউ কি এর জন্য সঠিক পরিবর্তনশীল জানেন?


প্রতিটি পাথ পৃথক লাইনে হওয়া উচিত দয়া করে
হ্যাঙ্কজি ২২'১৫

আপনার পথে নতুন লাইন থাকলে কী মুদ্রিত হওয়া উচিত?
মার্তিজান


ক্রস সাইট ডুপ্লিকেট unix.stackexchange.com/q/80151/85039
Sergiy Kolodyazhnyy

উত্তর:


57

চেষ্টা করুন sed:

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

বা tr:

$ tr ':' '\n' <<< "$PATH"

বা python:

$ python2 -c "import os; print os.environ['PATH'].replace(':', '\n')"

এখানে উপরের সমস্তগুলি :নতুন লাইনের সাথে সমস্ত ঘটনাকে প্রতিস্থাপন করবে \n


আপনার অজগর পদ্ধতির পার্থক্য:python -c 'import sys;print sys.argv[1].replace(":","\n")' $PATH
সের্গেই কলডিয়াজহনি

পাইথনের আর একটি ভিন্নতা, কান্ডা হ্যাকি: python -c "print r'$PATH'.replace(':', '\n')"(ব্যাকস্ল্যাশগুলির ক্ষেত্রে কাঁচা স্ট্রিং ব্যবহার করে)
wjandrea

3
trআমার জন্য কাজ (ম্যাক, বিটিডাব্লু)। ধন্যবাদ।
মাইক এস

আমার মতো যারা তাদের সাথে এটি যুক্ত করতে চান তাদের .bash_profileজন্য এটি যুক্ত করুন:alias path='tr ":" "\n" <<< "$PATH"'
মাইক এস

63

ব্যাশের প্যারামিটার সম্প্রসারণ ব্যবহার করুন :

echo "${PATH//:/$'\n'}"

এই সব প্রতিস্থাপন :মধ্যে $PATHএকটি newline (দ্বারা \n) এবং কপি করে প্রিন্ট ফলাফল। সামগ্রীর $PATHঅপরিবর্তিত রয়েছে।
আপনি যদি কেবল প্রথমটি প্রতিস্থাপন করতে চান :তবে দ্বিতীয় স্ল্যাশ সরিয়ে ফেলুন:echo -e "${PATH/:/\n}"


3
আমি মনে করি যে এটি সর্বোত্তম সমাধান কারণ এটি খাঁটি বাশে হয়েছে।
ryanmjacobs

1
@ আরয়ান্মজাকোবগুলি মৃদু কৌতূহল: আমার সমাধানটি কী ব্যবহার করে বলে আপনি মনে করেন? : ডি
মুড়ু

1
এটি কীভাবে কাজ করে তা দয়া করে ব্যাখ্যা করুন।
তুলিনাস কর্ডোভা

এ জাতীয় অপারেশনকে কী বলা হয়? এটি সেডের মতো তবে এটি সেড নয়। এর নাম কী তাই আমি এ সম্পর্কে আরও তথ্যের জন্য ওয়েবে অনুসন্ধান করতে পারি।
তুলসাইন কর্ডোভা

3
আমার উত্তরে লিঙ্কটি (প্যারামিটার সম্প্রসারণ) অনুসরণ করুন এবং শেষ দ্বিতীয় বিভাগে স্ক্রোল করুন:${parameter/pattern/string}
সাইরাস

27

আইএফএস ব্যবহার:

(set -f; IFS=:; printf "%s\n" $PATH)

IFSবাশ বিভক্ত করে এমন অক্ষর ধারণ করে, যাতে একটি IFSদিয়ে :বাশ $PATHঅন প্রসারিতকে বিভক্ত করে :printfআর্গুমেন্টগুলি শেষ হয়ে না যাওয়া পর্যন্ত ফর্ম্যাট স্ট্রিংয়ের উপর আর্গুমেন্টগুলি লুপ করে। আমাদের ব্যবহার করে গ্লোববিং (ওয়াইল্ডকার্ড সম্প্রসারণ) অক্ষম করা দরকার set -fযাতে PATH ডিরেক্টরিগুলির নামের ওয়াইল্ডকার্ডগুলি প্রসারিত না হয়।


2
এটি ব্যাকস্ল্যাশ এবং স্পেসগুলির সাথে সঠিকভাবে কাজ করে!
heinrich5991

14

ব্যবহার xargs:

xargs -n1 -d: <<< $PATH

থেকে man xargs

-n max-args
          Use  at  most  max-args  arguments per command line.

 -d delim
          Input  items  are terminated by the specified character.

এ বিষয়ে ভিন্নতা যেমন echo $PATH | xargs -n1 -d: echoঅনর্থক হতে পারে বা তাতে কিছু আসে যায় না?
সের্গি কোলোডিয়াজনি

@ সার্জ echo $PATH | xargs -n1 -d: আপনার জন্য একই কাজ করবে তবে আপনি আরও একটি শেল ব্যবহার করবেন। প্রথমটি মূল্যায়ন করবে echo $PATHএবং বাকীটি করার জন্য পরবর্তী শেলটিতে আউটপুট পাইপ করবে ।
সৌরভসি

7

এখানে গো সমতুল্য:

$ cat path.go
package main

import (
    "fmt"
    "os"
    "strings"
)

func main() {
    for _, p := range strings.Split(os.Getenv("PATH"), ":") {
        fmt.Println(p)
    }
}

$ go run path.go
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/home/nathan/.local/bin
/home/nathan/go/bin

7

এখানে আরও কয়েকটি পন্থা দেওয়া হল। আমি PATHব্যাকস্ল্যাশ, স্পেস এবং একটি নতুন লাইন সম্বলিত একটি ডিরেক্টরি ব্যবহার করছি যা দেখানোর জন্য যে তাদের যে কোনও কিছুর সাথে কাজ করা উচিত (নতুন লাইনে cutব্যর্থ হওয়া ব্যতীত ):

$ echo "$PATH"
/bin:usr/bin/:/usr/local/bin:/some\ horrible thing:/even 
new lines
  • কিছু পার্ল উপায়:

    $ perl -pe 's/:/\n/g' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    এর -pঅর্থ "প্রদত্ত স্ক্রিপ্ট প্রয়োগের পরে প্রতিটি ইনপুট লাইন মুদ্রণ করুন -e"। স্ক্রিপ্টটি নতুন লাইনের সাহায্যে প্রতিস্থাপন অপারেটর ( s/oldnew/) ব্যবহার করে :

    $ perl -lne 'print for split /:/' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    -lপ্রতিটি একটি newline যোগ printকল। এখানে, স্ক্রিপ্টটি তার ইনপুটটি বিভক্ত করছে :এবং তারপরে প্রতিটি বিভক্ত উপাদানকে লুপ করে এটিকে মুদ্রণ করবে।

    $ perl -F: -ane '$"="\n";print "@F"' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    -aতোলে perlমত আচরণ awk: এটা কর্তৃক প্রদত্ত চরিত্র তার ইনপুট লাইনের প্রতিটি বিভক্ত হবে -F(তাই :, এখানে) এবং অ্যারের মধ্যে সংরক্ষণ করতে @F। এটি $"হ'ল একটি বিশেষ পার্ল ভেরিয়েবল, "তালিকা বিভাজক", যার মান মুদ্রিত তালিকার প্রতিটি উপাদানগুলির মধ্যে মুদ্রিত হয়। সুতরাং এটি একটি নতুন লাইনে সেট করা print @listপ্রতিটি উপাদান @listএবং তারপরে একটি নতুন লাইন প্রিন্ট করবে । এখানে, আমরা এটি মুদ্রণের জন্য ব্যবহার করছি @F

    $ perl -F: -ane 'print join "\n", @F' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    উপরের মত একই ধারণা, কেবল কম গল্ফড। ব্যবহারের পরিবর্তে $", আমরা স্পষ্টভাবে joinনিউলাইনগুলি এবং তারপরে মুদ্রণের সাথে অ্যারে যুক্ত করছি with

  • grepপিসিআরই যাদুতে সহজ :

    $ grep -oP '(^|:)\K[^:]+' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    -oতোলে grep, প্রতিটি লাইনের শুধুমাত্র ম্যাচিং অংশ প্রিন্ট তাই প্রতিটি ম্যাচ একটি পৃথক লাইন ছাপা হয়। -Pপার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন (PCRE) সক্ষম করে। রেজেক্স নন- :( [^:]+) এর প্রসারগুলি সন্ধান করছে যা লাইন ( ^) বা কোনও :অক্ষরের শুরুর পরে অনুসরণ করে । \Kএকটি PCRE কৌতুক "এই বিন্দু আগে মিলেছে বাতিল কিছু" মানে এবং প্রিন্টিং এড়াতে এখানে ব্যবহার করা হয় :হিসাবে ভাল।

  • এবং একটি cutসমাধান (এটি একটি নতুন লাইনে ব্যর্থ, তবে ব্যাকস্ল্যাশ এবং স্পেসগুলি মোকাবেলা করতে পারে):

    $ cut -d: -f 1- --output-delimiter=$'\n' <<<"$PATH"
    /bin
    usr/bin/
    /usr/local/bin
    /some\ horrible thing
    /even 
    new lines
    

    ব্যবহৃত বিকল্পগুলি হ'ল যা -d:ইনপুট ডিলিমিটার সেট করে :, -f 1-যার অর্থ সমস্ত ক্ষেত্র মুদ্রণ করা (প্রথম থেকে শেষ পর্যন্ত) এবং --output-delimiter=$'\n'যা ভাল, আউটপুট ডিলিমিটার সেট করে। $'\n'হয় ANSI সি উদ্ধৃত এবং একটি উপায় শেল মধ্যে একটি newline অক্ষর প্রিন্ট করতে হয়।

উপরের সমস্ত উদাহরণগুলিতে, আমি প্রোগ্রামের ইনপুট হিসাবে একটি স্ট্রিং পাস করতে এখানে বাশের (এবং কিছু অন্যান্য শেলস) এখানে স্ট্রিং ( <<<) অপারেটর ব্যবহার করছি। সুতরাং command <<<"foo"সমতূল্য echo -n "foo" | command। মনে রাখবেন যে আমি সর্বদা উদ্ধৃতি দিচ্ছি "$PATH", উদ্ধৃতিগুলি না থাকলে শেলটি নতুন লাইনের চরিত্রটি খেয়ে ফেলত।


@ 7 স্টুড মন্তব্যগুলিতে আরেকটি পন্থা দিয়েছেন যা অন্তর্ভুক্ত না করা খুব ভাল:

$ perl -0x3a -l012 -pe '' <<<"$PATH"

এটিই গল্ফিং নামে পরিচিত । -0একটি অকট্যাল বা হেক্সাডেসিমেল সংখ্যা হিসাবে ইনপুট রেকর্ড বিভাজক নির্দিষ্ট করে। এটি একটি "লাইন" সংজ্ঞায়িত করে এবং এর ডিফল্ট মান হ'ল \nএকটি নতুন লাইন চরিত্র। এখানে, আমরা এটিকে সেটিং করছি :যা x3aএ হেক্স (চেষ্টা printf '\x3a\n')। -lতিনটি জিনিস আছে। প্রথমে এটি $/প্রতিটি লাইনের প্রান্ত থেকে ইনপুট রেকর্ড বিভাজক ( ) সরিয়ে দেয় :here কার্যকরভাবে এখানে সরিয়ে দেয় — এবং দ্বিতীয়টি, এটি আউটপুট রেকর্ড বিভাজক ( $\) সেট করে যা যা অষ্টাল বা হেক্স মান দেওয়া হয় তা ( 012হয় \n)। যদি $\সংজ্ঞায়িত করা হয় তবে এটি প্রতিটি printকলের শেষে যুক্ত করা হয় , সুতরাং এটি প্রতিটিটিতে একটি নতুন লাইন যুক্ত হবে print

-peইচ্ছা পি স্ক্রিপ্ট দেওয়া প্রয়োগের পরে প্রতিটি ইনপুট লাইন দ্রণ -e। এখানে কোনও স্ক্রিপ্ট নেই কারণ সমস্ত কাজটি উপরে বর্ণিত হিসাবে বিকল্পের পতাকা দ্বারা করা হয়!


আপনার পার্ল এক লাইনার যথেষ্ট অস্পষ্ট নয়! এখানে একটি সংস্করণ যেখানে -e সুইচ চালানো কারণ অন্যান্য সুইচ সবকিছু হ্যান্ডেল জন্য কোন কোড আছে আছে: perl -0x3a -l012 -pe '' <<<$PATH। ব্যাখ্যা: -0ইনপুট রেকর্ড বিভাজক সেট করে (হেক্স / অক্টাল নোটেশনে উল্লিখিত, এক্স 3 এ কোলন রয়েছে), -lদুটি কাজ করে: 1) এটি ইনপুট রেকর্ড বিভাজককে চম্পস করে, 2) এটি নির্দিষ্ট করা থাকলে আউটপুট রেকর্ড বিভাজককে সেট করে (অষ্টাল নোটেশনে , 012 একটি নতুন লাইন)। একটি -p$: _ মূল্য যা প্রতিটি হতে হবে আউট লুপ কপি করে প্রিন্ট লাইন পড়া।
7stud

এছাড়াও মনে রাখবেন যে আপনার উদাহরণ ব্যবহার -Fবাদ দিতে পারে -aএবং -nপতাকা, -F স্বয়ংক্রিয়ভাবে ঐ সক্রিয় হিসাবে: perl -F: -e 'print(join "\n", @F);' <<<$PATHপার্লারুন দেখুন । সুন্দর উদাহরণ।
7stud

@ সপ্তম বাহ, সত্যিই উজ্জ্বল, ধন্যবাদ! নির্লজ্জভাবে চুরি হয়ে গেছে এবং আমার উত্তরে যুক্ত হয়েছে (আমি ধরে নিলাম আপনি কিছু মনে করবেন না, এটি উত্তর হিসাবে নিজেই পোস্ট করুন এবং আমি এটি মুছে ফেলব)। এবং -Fতথ্যের জন্য ধন্যবাদ । আমি বছরের পর বছর ধরে -Fসম্মিলিতভাবে ব্যবহার করছি -an, আমি কখনই বুঝতে পারি নি যে এটি অন্যকে বোঝায়। যাইহোক, আমি সার্গের কোড গল্ফ উল্লেখ করেছেন দেখেছি , তবে আমি মনে করি আপনি যদি এই ধরণের জিনিসটিতে থাকেন তবে আপনি ইউনিক্স এবং লিনাক্সও উপভোগ করবেন ।
টেরডন

হেই ধন্যবাদ. এই বিবৃতি সম্পর্কে একটি স্পষ্টতা: অবশেষে, -lপ্রতিটি মুদ্রণ কল শেষে প্রদত্ত আউটপুট রেকর্ড বিভাজক যুক্ত করে। প্রকৃতপক্ষে, মুদ্রণ সবসময় আউটপুট রেকর্ড বিভাজক যুক্ত করে, $/একটি স্ট্রিংয়ের শেষে - যদি আউটপুট রেকর্ড বিভাজককে সংজ্ঞায়িত করা হয়। ডিফল্টরূপে এটি অপরিশোধিত। সুতরাং -lজাস্ট সেট করে $/এবং এর ফলে মুদ্রণটি স্ট্রিংয়ের শেষে নতুন লাইন যুক্ত করে।
7stud

আমি ধরে নিলাম আপনি কিছু মনে করবেন না - মোটেই নয়। :)
7

6

এই উত্তরে:

  1. সি
  2. পাইথন
  3. চুনি
  4. বিকল্প awk

1. সি

যেহেতু সমস্ত স্ক্রিপ্টিং ভাষা ইতিমধ্যে নেওয়া হয়েছে, তাই আমি সি এর সাথে যাব get_env()ফাংশন সহ পরিবেশের ভেরিয়েবলগুলি পাওয়া খুব সহজ ( জিএনইউ সি লাইব্রেরির ডকুমেন্টেশন দেখুন )। বাকিটি কেবল চরিত্রের কারসাজি

bash-4.3$ cat get_path.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char *path = getenv("PATH");
    int length = strlen(path) -1;
    for(int i=0;i<=length;i++){
        if (path[i] == ':')
            path[i] = '\n';
        printf("%c",path[i]);
    }
    printf("\n");
    return 0;
}
bash-4.3$ gcc get_path.c
bash-4.3$ ./a.out 
/home/xieerqi/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/opt/microchip/xc16/v1.25/bin
/opt/microchip/xc32/v1.40/bin
/opt/microchip/xc8/v1.35/bin
/home/xieerqi/bin
/home/xieerqi/bin/sh

2. পাইথন

তবে "কেন নয়" কারণ, এখানে কমান্ড লাইন আর্গুমেন্টের মাধ্যমে বিকল্প পাইথন সংস্করণ sys.argv

python -c 'import sys; print "\n".join(sys.argv[1].split(":"))' "$PATH"

3. রুবি

সি সংকলক এবং পাইথন ইন্টারপ্রেটারের বিপরীতে রুবি ডিফল্টরূপে উবুন্টুর সাথে আসে না, তবে আপনি যদি কখনও নিজেকে এটি ব্যবহার করে দেখতে পান তবে রুবির সমাধানটি হ'ল:

ruby -ne 'puts $_.split(":")' <<< "$PATH"

7stud দ্বারা প্রস্তাবিত হিসাবে (আপনি আপনাকে অনেক ধন্যবাদ!) এ মন্তব্য , এটি সঙ্গে সংক্ষিপ্ত করা যেতে পারে

ruby -F: -ane 'puts $F' <<<$PATH

এবং এই ভাবে

ruby -0072 -ne 'puts chomp' <<<$PATH

৪. বিকল্প অজ

split()অ্যারেতে পঠিত লাইনটি ভাঙ্গতে আমরা ফাংশনটি ব্যবহার করতে পারি এবং for-eachপ্রতিটি আইটেমকে আলাদা লাইনে মুদ্রণ করতে লুপ ব্যবহার করতে পারি।

awk '{split($0,arr,":"); for(var in arr) print arr[var]}' <<< $PATH

1
সুন্দর রুবি উদাহরণ। putsস্বয়ংক্রিয়ভাবে আলাদা লাইনে একটি অ্যারের উপাদানগুলি মুদ্রণ করে! আপনি সুইচগুলি বিভাজনটিও করতে পারেন: ruby -F: -ane 'puts $F' <<<$PATH ব্যাখ্যা: নির্দিষ্ট বর্ণকে -Fসেট $;করে, যা স্ট্রিং :: স্প্লিট দ্বারা ব্যবহৃত ডিফল্ট বিভাজক ($; শূন্যস্থানতে বিভাজিত) এর একটি ডিফল্ট মান থাকে। -aকলকে $ _। বিভক্ত করুন, যেখানে $ _ একটি লাইনটি get ()) ব্যবহার করে পড়ে এবং ফলাফলটি অ্যারে নির্ধারিত করে $F
7stud

@ 7stud আরে, ধন্যবাদ! :) কী -Fপতাকা আছে তা জানতাম না - আমি কেবল রুবির সাথেই শুরু করছি, তাই কিছুটা অপরিশোধিত উপায়ে কাজ করছি।
সের্গেই কোলোডিয়াজনি

না, এটি অস্পষ্ট জিনিস। আপনার একটি লাইনার খুব পঠনযোগ্য এবং স্পষ্টতার সাথে প্রতিবারের বংশবৃদ্ধি হওয়া উচিত।
7stud

Hah। আমি একটি সংক্ষিপ্ত এক মূর্ত আউট: ruby -0072 -ne 'puts chomp' <<<$PATH। ব্যাখ্যা: -0ইনপুট রেকর্ড বিভাজক সেট করে (অষ্টাল বিন্যাসে একটি অক্ষর নির্দিষ্ট করুন; 072 কোলন হয়)। রুবি পার্লের অনুরূপ উপায়ে $ _ নিয়োগ করে। পায় () পদ্ধতিটি (লুপটিতে ব্যবহৃত -n) বর্তমান পংক্তিতে to _ সেট করে read _ সেট করে And এবং chomp()কোনও আর্গ, চম্পস ছাড়াই। _। আমি এখনও আপনার ভাল পছন্দ। :)
7stud

@ 7 স্টুড আসলে, আপনি -Fপতাকা সহ প্রথম পোস্ট করেছিলেন , তা খাটো। যদি আপনি echo "ruby -F: -ane 'puts $F' <<<$PATH" |wc -c এটি করেন তবে এটি আমাকে 271, বাইট বলে, তবে অষ্টাল সংখ্যাটি একটি 276 That's এটি পুরো কমান্ডের জন্য অবশ্যই, যদি আমরা কেবল কোডটি বিবেচনা করি তবে puts $Fএটি স্পষ্টভাবে খাটো। :) যাইহোক, আপনি কোড গল্ফ সম্পর্কে জানেন ? এটি সর্বনিম্ন সংখ্যা বাইটে প্রোগ্রামিং ধাঁধা সমাধানের জন্য সাইট। : এই এক সংক্রান্ত প্রশ্ন codegolf.stackexchange.com/q/96334/55572
Sergiy Kolodyazhnyy

5

সম্ভবত একমাত্র উপায় যা উল্লেখ করা হয়নি তা হ'ল আমি বছরের পর বছর ধরে এটি ব্যবহার করে চলেছি:

echo $PATH | tr ":" "\n"

সুতরাং, আপনার। প্রোফাইলে বা .বাশ_প্রফাইলে বা যাই হোক না কেন, আপনি যুক্ত করতে পারেন:

alias path='echo $PATH | tr ":" "\n"'


1
এই উত্তরটি ইতিমধ্যে এটি উল্লেখ করেছে ..
হিমনাইল

হ্যাঁ, তবে আমি ওরফে পরামর্শটি পছন্দ করি।
7stud

4

আমাদের আরও জাভা দরকার!

public class GetPathByLine {
    public static void main(String[] args) {
        for (String p : System.getenv("PATH").split(":")) {
            System.out.println(p);
        }
    }
}

এটিতে সংরক্ষণ করুন GetPathByLine.javaএবং ব্যবহার করে সংকলন করুন:

javac GetPathByLine.java

সাথে চালান:

java GetPathByLine

┌─[17:06:55]─[kazwolfe@BlackHawk]
└──> ~ $ cat GetPathByLine.java 
public class GetPathByLine {
    public static void main(String[] args) {
        for (String p : System.getenv("PATH").split(":")) {
            System.out.println(p);
        }
    }
}
┌─[17:06:58]─[kazwolfe@BlackHawk]
└──> ~ $ javac GetPathByLine.java 
┌─[17:07:02]─[kazwolfe@BlackHawk]
└──> ~ $ java GetPathByLine 
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

বাহ এটা overkill হয়। আপনি পাইথন 3 এ এক লাইনে এটি করতে পারেন:python3 -c "import os; [print(p) for p in os.getenv('PATH').split(':')]"
wjandrea

1
@ উজান্দ্রেয়া এটাই কথা! : ডি
কাজ ওল্ফ

3

অজস্র মাধ্যমে।

echo $PATH | awk -F: '{for(i=1;i<=NF;i++)print $i}'

অজগর মাধ্যমে।

$ echo $PATH | python3 -c 'import fileinput
for line in fileinput.input():
    for i in line.split(":"):
        print(i)'

দ্রষ্টব্য যে পাইথন ইনডেন্টেশন খুব গুরুত্বপূর্ণ।


সংক্ষিপ্ত আকার:echo $PATH | awk '{gsub(/\:/,"\n");print}'
সের্গেই কলডিয়াজহনি

fileinputআপনি ঠিক যখন ব্যবহার করতে পারলেন তখন কেন আপনি বিরক্ত হবেন তা নিশ্চিত নই input:python3 -c 'print(*input().split(":"), sep="\n")' <<< "$PATH"
ওজান্দ্রিয়া

2

আমি স্টিফেন কলির "বাশ পাথ ফাংশন" ব্যবহার করি ( লিনাক্স জার্নালে তার নিবন্ধটি দেখুন )। এটি শেল প্রোগ্রামিংয়ে ডেটাটাইপ হিসাবে "কোলন বিচ্ছিন্ন তালিকা" ব্যবহার করার অনুমতি দেয়। উদাহরণস্বরূপ, আমি বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরি একটি তালিকা উত্পাদন করতে পারেন:

dirs="";for i in * ; do if [ -d $i ] ; then addpath -p dirs $i; fi; done  

তারপরে, listpath -p dirsএকটি তালিকা তৈরি করে।


2

@ সাইরাস উত্তরের ব্যাখ্যা

echo "${PATH//:/$'\n'}"

নোট:

এএনএসআই-সি উদ্ধৃতি - এটি some 'কিছু te ntext' ব্যাখ্যা করে

শেল প্যারামিটার সম্প্রসারণ - এটি $ {প্যারামিটার / প্যাটার্ন / স্ট্রিং explains ব্যাখ্যা করে, যদি প্যাটার্নটি '/' দিয়ে শুরু হয় তবে প্যাটার্নের সমস্ত ম্যাচ স্ট্রিংয়ের সাথে প্রতিস্থাপিত হবে।

তাহলে আমাদের আছে:

  1. একটি প্যাটার্ন /: যা সমস্ত ম্যাচ প্রতিস্থাপন করতে '/' দিয়ে শুরু হয়
  2. একটি স্ট্রিং $ '\ n' যা নতুন লাইন প্রতীক (\ n) এর চিকিত্সার জন্য any 'anytext' সংকোচনের সাথে উদ্ধৃত হয়েছে।

1

অন্য AWK উপায় হ'ল প্রতিটি ডিরেক্টরিকে আলাদা ক্ষেত্র হিসাবে না বরং পৃথক রেকর্ড হিসাবে বিবেচনা করা ।

awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"

আমি সিনট্যাক্সটি বিশেষভাবে স্বজ্ঞাত বলে মনে করি। তবে, যদি আপনি চান, তবে আপনি এটি অন্তর্ভুক্ত করে সংক্ষিপ্ত করতে পারেন print $0(এটি ডিফল্ট ক্রিয়া এবং 1সত্যকে মূল্যায়ন করে এটি প্রতিটি লাইনের জন্য সম্পন্ন করে):

awk 'BEGIN{RS=":"} 1' <<<"$PATH"

এডব্লিউকে এর ডিফল্ট ইনপুট এবং আউটপুট রেকর্ড বিভাজক হ'ল নতুন লাইন (লাইন ব্রেক)। ইনপুটটি পড়ার আগে ইনপুট রেকর্ড বিভাজক ( RS) সেট করে :, এডাব্লুকে স্বয়ংক্রিয়ভাবে $PATHতার গঠন নির্দেশক নামগুলিতে একটি কোলন-সীমাবদ্ধ পার্স করে । এডব্লু $0কে প্রতিটি পুরো রেকর্ডে প্রসারিত হয়, নতুন লাইন আউটপুট রেকর্ড বিভাজক হিসাবে থাকে এবং কোনও লুপিং বা gsubপ্রয়োজন হয় না।

ek@Io:~$ echo "$PATH"
/home/ek/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"
/home/ek/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

এডাব্লুকে প্রায়শই পৃথক ক্ষেত্রগুলিতে রেকর্ড বিশ্লেষণ করতে ব্যবহৃত হয়, তবে কেবল ডিরেক্টরি নামের একটি তালিকা তৈরি করার প্রয়োজন নেই।

এটি ফাঁকা (ফাঁকা স্থান এবং ট্যাবগুলি) এমনকি একাধিক পরপর শূন্যস্থানযুক্ত ইনপুটটির জন্যও কাজ করে:

ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<$'ab\t\t c:de    fg:h'
ab               c
de    fg
h

এটি হ'ল যদি না আপনি AWK রেকর্ডটি পুনর্নির্মাণ করতে (নীচে দেখুন) না করেন তবে ইনপুটে স্পেস বা ট্যাব (ডিফল্ট ক্ষেত্র বিভাজক) থাকা কোনও সমস্যা নয়। আপনার PATHসম্ভবত কোনও উবুন্টু সিস্টেমে স্পেস নেই, তবে যদি এটি হয় তবে এটি এখনও কার্যকর হবে।


পার্শ্ব নোট হিসাবে এটি উল্লেখ করার মতো, ক্ষেত্রের সংগ্রহ হিসাবে AWK এর রেকর্ডটি ব্যাখ্যা করার ক্ষমতা ডিরেক্টরি উপাদানগুলির একটি টেবিল তৈরির সম্পর্কিত সমস্যার জন্য দরকারী হয়ে ওঠে :

ek@Io:~$ awk -F/ 'BEGIN{RS=":"; OFS="\t"} {$1=$1; print $0}' <<<"$PATH"
        home    ek      bin
        usr     local   sbin
        usr     local   bin
        usr     sbin
        usr     bin
        sbin
        bin
        usr     games
        usr     local   games
        snap    bin

কৌতূহলী $1=$1অ্যাসাইনমেন্টটি রেকর্ডটি পুনর্নির্মাণে এডাব্লুকে বাধ্য করার উদ্দেশ্যে কাজ করে ।

(কেবলমাত্র টেবিল প্রিন্ট করার সঠিক উদাহরণের চেয়ে উপাদানগুলির জন্য অতিরিক্ত প্রক্রিয়াজাতকরণ করা ক্ষেত্রে এটি সম্ভবত আরও কার্যকর)



0

কীভাবে $ PATH এ পাথগুলি আলাদাভাবে প্রদর্শন করবেন

এগুলি আমার নিজের ব্যবহারের ক্ষেত্রে এবং সামঞ্জস্যতা এবং সংস্থান ব্যবহার সম্পর্কে উদ্বেগের ভিত্তিতে এটি করার আমার পছন্দের উপায়।

tr

প্রথমত, আপনার যদি দ্রুত প্রয়োজন, সহজে মনে রাখার জন্য, এবং পাঠযোগ্য সমাধান, শুধু echo PATHএবং পাইপ এটি অনুবাদ করুন ( tr) নতুন লাইন মধ্যে কোলন চালু করতে:

echo $PATH | tr : "\n"

পাইপের কারণে এটিতে দুটি প্রক্রিয়া ব্যবহার করার ক্ষয়ক্ষতি রয়েছে তবে আমরা যদি কেবলমাত্র একটি টার্মিনালে হ্যাক করি তবে আমরা কি সত্যিই সেটার যত্ন নিই?

বাশের শেল প্যারামিটার সম্প্রসারণ

.bashrcইন্টারেক্টিভ ব্যবহারের জন্য যদি আপনি মোটামুটি স্থায়ী সমাধান চান তবে নীচের কমান্ডটি আপনার কাছে ব্যবহার করতে পারেন path, তবে এই সমাধানটির পঠনযোগ্যতা প্রশ্নবিদ্ধ:

alias path="echo \"${PATH//:/$'\n'}\""

যদি প্যাটার্নটি '/' দিয়ে শুরু হয় তবে প্যাটার্নের সমস্ত ম্যাচ স্ট্রিংয়ের সাথে প্রতিস্থাপিত হবে। সাধারণত প্রথম ম্যাচটি প্রতিস্থাপন করা হয়।

উপরের কমান্ডটি বাশের শেল প্যারামিটার এক্সপেনশন ব্যবহার করে নতুন লাইনগুলি সহ কোলনকে প্রতিস্থাপন করে :

${parameter/pattern/string}

এটি ব্যাখ্যা করতে:

          # v--v---------delimiters, a'la sed
echo "${PATH//:/$'\n'}"
          #  ^^ ^^^^^----string, $ required to get newline character.
          #   \----------pattern, / required to substitute for *every* :.

যদিও আপনি কেবল কমান্ড লাইনে হ্যাক করছেন ঠিক আছে তা মনে রাখার জন্য সৌভাগ্য।

আইএফএস, বাশ এবং ড্যাশ পরীক্ষিত

বিকল্পভাবে, মোটামুটি ক্রস-সামঞ্জস্যপূর্ণ, পঠনযোগ্য এবং বোধগম্য পদ্ধতির যা শেল ছাড়া অন্য কোনও কিছুর উপর নির্ভর করে না নীচের ফাংশনটি ব্যবহার করুন (আমি আপনাকে প্রস্তাব দিই .bashrc।)

নিম্নলিখিত ফাংশনটি অস্থায়ীভাবে অভ্যন্তরীণ (বা ইনপুট) ফিল্ড বিভাজক (আইএফএস) একটি কোলন করে তোলে এবং যখন অ্যারে দেওয়া হয় printf, অ্যারেটি ব্যবহার না করা অবধি এটি সম্পাদন করে:

path () {
    local IFS=:
    printf "%s\n" ${PATH}
    }

এই পদ্ধতি ফাংশন সৃষ্টি , IFSএবং printfজন্য posix দ্বারা, প্রদান করা হয়, তাই এটি (যেমন বিশেষত ড্যাশ, যা উবুন্টু সাধারণত alias লেখা সবচেয়ে posix মত শাঁস মধ্যে কাজ করা উচিত sh)।

পাইথন

এর জন্য আপনার কি পাইথন ব্যবহার করা উচিত? আপনি পারে। এটি এর জন্য আমি সবচেয়ে সংক্ষিপ্ত পাইথন কমান্ডটি ভাবতে পারি:

python -c "print('\n'.join('${PATH}'.split(':')))"

বা পাইথন 3 কেবল (এবং সম্ভবত আরও পাঠযোগ্য)?

python3 -c "print(*'${PATH}'.split(':'), sep='\n')"

এগুলি যে কোনও সাধারণ শেল পরিবেশেও কাজ করা উচিত, যতক্ষণ আপনার অজগর থাকে।


0

এই সমাধানটি জাভা , সি , গো এবং অজানা সমাধানগুলির চেয়ে সহজ :

$ LPATH=$PATH wine cmd /c echo %LPATH::=$'\n'% 2> /dev/null
/usr/local/bin
/usr/local/sbin
/usr/bin
/usr/sbin

এখানে আরও একটি দুর্দান্ত সম্ভাবনা রয়েছে:

$ jrunscript -classpath /usr/share/java/bsh.jar -e 'print(java.lang.System.getenv("PATH").replaceAll(":","\n"))'
/usr/local/bin
/usr/local/sbin
/usr/bin
/usr/sbin

এটির জন্য কিছু নির্ভরতা ইনস্টল করা প্রয়োজন:

sudo apt-get install openjdk-8-jdk-headless bsh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.