PATH থেকে একটি ডিরেক্টরি সরানো হচ্ছে


28

আমি মিংডাব্লু ব্যবহার করে ডাব্লুউইউজেডস সংকলন করার চেষ্টা করছি এবং আমার পথে সাইগউইন রয়েছে, যা মনে হয় এটি দ্বন্দ্ব বলে মনে হচ্ছে। সুতরাং আমি /d/Programme/cygwin/binPATH ভেরিয়েবল থেকে অপসারণ করতে চাই এবং আমি ভাবছি যে এটি করার মতো কোনও মার্জিত উপায় আছে কিনা।

নিষ্পাপ দৃষ্টিভঙ্গি হ'ল এটি কোনও ফাইলে প্রতিধ্বনিত হবে, ম্যানুয়ালি মুছে ফেলুন এবং এটি উত্স তৈরি করুন, তবে আমি বাজি ধরেছি যে এর থেকে আরও ভাল পন্থা থাকতে পারে।


2
অনেক কৌশল এখানে তালিকাভুক্ত করা হয়েছে: স্ট্যাকওভারফ্লো.com
প্রশ্নস

উত্তর:


23

Edit PATH এর মান "সম্পাদনা" করার জন্য কোনও স্ট্যান্ডার্ড সরঞ্জাম নেই (যেমন "কেবলমাত্র ফোল্ডার যুক্ত হবে যখন এটি ইতিমধ্যে উপস্থিত নেই" বা "এই ফোল্ডারটি সরান")। আপনি কেবল কার্যকর:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

এটি বর্তমান অধিবেশনটির জন্য, যদি আপনি স্থায়ীভাবে পরিবর্তন করতে চান এটি কোনও .bashrc, bash.bashrc, / etc / প্রোফাইলে যোগ করুন - আপনার সিস্টেম এবং ব্যবহারকারীর প্রয়োজন অনুসারে যা কিছু ফিট করে। তবে আপনি যদি BASH ব্যবহার করছেন তবে আপনি নিম্নলিখিতগুলিও করতে পারেন যদি বলি যে, আপনি /home/wrong/dir/আপনার PATH ভেরিয়েবল থেকে ডিরেক্টরিটি সরিয়ে ফেলতে চান , শেষে এটি ধরে নিচ্ছেন:

PATH=$(echo "$PATH" | sed -e 's/:\/home\/wrong\/dir$//')

সুতরাং আপনার ক্ষেত্রে আপনি ব্যবহার করতে পারেন

PATH=$(echo "$PATH" | sed -e 's/:\/d\/Programme\/cygwin\/bin$//')

1
যদি প্রশ্নে থাকা পথটি PATH ভেরিয়েবলের শুরুতে হয়, আপনার শেষে কোলনটি মিলানো দরকার। এটি একটি বিরক্তিকর ক্যাভিয়েট যা PATH ভেরিয়েবলগুলির সহজ জেনেরিক ম্যানিপুলেশনগুলিকে জটিল করে তোলে।
গ্রামীণ

4
এতগুলি স্ল্যাশ নিয়ে কাজ করার সময় আমি রেজিেক্স ডিলিমিটারকে /এমন কিছু দিয়ে পরিবর্তন করতে পছন্দ করি |: PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')সমস্ত পালানো রোধ করতে।
ম্যাথিয়াস কুহন

17

ব্যাশে:

directory_to_remove=/d/Programme/cygwin/bin
PATH=:$PATH:
PATH=${PATH//:$directory_to_remove:/:}
PATH=${PATH#:}; PATH=${PATH%:}

আপনি যদি কোনও মধ্যবর্তী ভেরিয়েবল ব্যবহার না করেন তবে আপনাকে /ডিরেক্টরিতে থাকা অক্ষরগুলি সরাতে রক্ষা করতে হবে যাতে সেগুলি অনুসন্ধানের পাঠ্যের শেষ হিসাবে বিবেচনা করা হয় না।

PATH=:$PATH:
PATH=${PATH//:\/d\/Programme\/cygwin\/bin:/:}
PATH=${PATH#:}; PATH=${PATH%:}

:প্রথম এবং শেষ উপাদানটি বিশেষ-কেসিং এড়ানোর জন্য অনুসন্ধানের পাথের প্রতিটি উপাদানকে ঘিরে রাখার ব্যবস্থা করার জন্য সেখানে প্রথম এবং তৃতীয় লাইন রয়েছে । দ্বিতীয় লাইনটি নির্দিষ্ট উপাদানটিকে সরিয়ে দেয়।


ধন্যবাদ @ গিলিস, আপনার উত্তর আমাকে আমার নিজস্ব সমাধান নিয়ে আসতে উত্সাহিত করেছে , যার জন্য কেবলমাত্র চারটি পিএএইচএইচ এর পরিবর্তে চারটি হেরফের দরকার। * 8 ')
মার্ক বুথ

8

এখানে উপস্থাপিত অন্যান্য বিকল্পগুলি বিবেচনা করার পরে এবং তাদের মধ্যে কিছু কীভাবে কাজ করেছে তা পুরোপুরি বুঝতে না পেরে আমি আমার নিজস্ব path_removeফাংশন বিকাশ করেছি , যা আমি আমার সাথে যুক্ত করেছি .bashrc:

function path_remove {
  # Delete path by parts so we can never accidentally remove sub paths
  PATH=${PATH//":$1:"/":"} # delete any instances in the middle
  PATH=${PATH/#"$1:"/} # delete any instance at the beginning
  PATH=${PATH/%":$1"/} # delete any instance in the at the end
}

এটি গিলসের সমাধানের খুব কাছাকাছি পৌঁছেছিল তবে কমান্ড লাইনে সহজেই ব্যবহার করা যেতে পারে এমন ব্যাশ ফাংশন হিসাবে এটি জড়িত।

এটির সুবিধাগুলি রয়েছে যে বাশ ফাংশন হিসাবে এটি কোনও প্রোগ্রামের মতো পথে চলার দরকার ছাড়া কোনও প্রোগ্রামের মতো কাজ করে এবং এটি চালানোর জন্য কোনও বাহ্যিক প্রোগ্রামের প্রয়োজন হয় না, কেবল বাশ স্ট্রিং ম্যানিপুলেশন।

এটি বেশ দৃust়রূপে প্রদর্শিত হয়, বিশেষত এটি somepath:mypath/mysubpathরূপান্তরিত হয় না somepath/mysubpath: আপনি যদি চালনা করেন path_remove mypathযা আমার আগের path_removeফাংশনটি নিয়ে সমস্যা ছিল ।

কীভাবে বাশ স্ট্রিং ম্যানিপুলেশন কাজ করে তার একটি দুর্দান্ত ব্যাখ্যা অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইডে পাওয়া যাবে


6

সুতরাং, @ গিলিস এবং @ ব্রুনো-এ (এবং অন্যান্য কয়েকটি চালিত কৌশলগুলি) এর উত্তরগুলি একত্রিত করে আমি এই ওয়ান-লাইনার নিয়ে এসেছি, যা শুরু থেকে ঘটবে কিনা তা বিবেচনা না করে প্যাথ থেকে (প্রতিটি) REMOVE_PART মুছে ফেলবে, মধ্যম বা পথের শেষ

PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')

এটি কিছুটা স্বাস্থ্যকর নয়, তবে এটি এক হিটের মধ্যে সক্ষম হতে পেরে খুব ভাল। ;একসঙ্গে দুটি পৃথক sed কমান্ড যোগদানের জন্য ব্যবহার করা হয়:

  • s@:$REMOVE_PART:@:@g(যা :$REMOVE_PART:একক দিয়ে প্রতিস্থাপন করে :)
  • s@^:\(.*\):\$@\1@ (যা প্রতিধ্বনি কমান্ডের সাহায্যে আমরা যোগ করা নেতৃস্থানীয় এবং ট্রেইলিং কলোনগুলি সরিয়ে ফেলে)

এবং অনুরূপ লাইন বরাবর, আমি কেবলমাত্র এই ওয়ান-লাইনারের সাথে পথের মধ্যে একটি ADD_PART যুক্ত করার জন্য এগিয়ে এসেছি, কেবল যদি প্যাথটি ইতিমধ্যে এটি ধারণ করে না if

PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi')

echo "$PATH:$ADD_PART"আপনি আরম্ভের পরিবর্তে PATH এর শেষে ADD_PART যুক্ত করতে চান তবে শেষ অংশটি পরিবর্তন করুন ।

...

... বা এটিকে আরও সহজ remove_path_partকরার জন্য বিষয়বস্তু সহ একটি স্ক্রিপ্ট তৈরি করুন

echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"

এবং prepend_path_partবিষয়বস্তু সহ একটি স্ক্রিপ্ট বলা হয়

if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi

এবং append_path_partবিষয়বস্তু সহ একটি স্ক্রিপ্ট বলা হয়

if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi

এগুলি সকলকে সম্পাদনযোগ্য করে তুলুন এবং তারপরে তাদের মতো কল করুন:

  • PATH=$(remove_path_part /d/Programme/cygwin/bin)
  • PATH=$(prepend_path_part /d/Programme/cygwin/bin)
  • PATH=$(append_path_part /d/Programme/cygwin/bin)

ঝরঝরে, আমি নিজেও তাই বললেও :-)


আমি পরামর্শটি বিশেষত স্ক্রিপ্টগুলি সহ ধারণাটি পছন্দ করি।
দেবোলাস

3

অনেক সহজ একটি লাইনার।

PATH = `প্রতিধ্বনি $ PATH | রফতানি করুন tr ":" "\ n" | grep -v "anaconda" | tr "` n "": "`


2

কোনও পাথ ভেরিয়েবল থেকে ডিরেক্টরি মুছে ফেলার জন্য ব্যাশ ফাংশনটি লেখা একটি আকর্ষণীয় অনুশীলন।

আমি আমার .বাশ * ফাইলগুলিতে পাথগুলিতে ডিরেক্টরি সংযোজন / সংযোজন করতে কিছু ফাংশন দিচ্ছি। তাদের সদৃশ এন্ট্রিগুলি সরিয়ে ফেলার গুণ রয়েছে, যদি থাকে এবং কোনও ধরণের কোলন বিচ্ছিন্ন পাথ ভেরিয়েবল (প্যাথ, মনপথ, ইনফোপথ, ...) এর সাথে কাজ করে। মুছে ফেলা_ফর্ম ফাংশন ডিরেক্টরিটি সরিয়ে দেয়।

# {app,pre}pend_to path-var-name dirpath
# remove_from path-var-name dirpath
#
# Functions to manipulate a path-style variable.  {app,pre}pend_to
# both remove any other instances of dirname before adding it to
# the start or end of the path-var-name variable.
#
# Calling example:
#   append_to PATH "/usr/local/bin"
#
# Uses eval to allow target path varname to be passed in.
function remove_from() {
  # add surrounging colons
  eval tmp_path=":\$${1}:"
  # if dir is already there, remove it
  (echo "${tmp_path}" | grep --silent ":${2}:") &&
    tmp_path=`echo "$tmp_path" | sed "s=:${2}:=:=g"`
  # remove surrounding colons
  tmp_path=`echo "$tmp_path" | sed 's=^:==; s=:$=='`
  eval export $1=\"$tmp_path\"
}
function append_to() {
  remove_from "$1" "$2"  # clean the path contents
  eval export $1=\"\$${1}:$2\"
}
function prepend_to() {
  remove_from "$1" "$2"  # clean the path contents
  eval export $1=\"${2}:\$$1\"
}

2

নীচে গ্রেগ তারসার সমাধান থেকে সংশোধিত কোড দেওয়া আছে। এখানে কেবল ব্যাশ বিল্ড-ইন কমান্ড ব্যবহার করা হয়। সুতরাং, এটি কাঁটাচামচ () সিস্টেমের প্রচুর কল সংরক্ষণ করবে।

# Calling example:
#   append_to PATH "/usr/local/bin"

function remove_from()
{
    local path="${1}"
    local dir="${2}"
    local -a dirs=()
    local old_ifs="${IFS}"
    IFS=":"
    set -- ${!path}
    while [ "$#" -gt "0" ]
    do
        [ "${1}" != "${dir}" ] && dirs+=("${1}")
        shift
        done
    eval "export ${path}=\"${dirs[*]}\""
    IFS="${old_ifs}"
}

function append_to()
{
    remove_from "${1}" "${2}"
    [ -d "${2}" ] || return
    if [ -n "${!1}" ]
    then
        eval "export ${1}=\"${!1}:${2}\""
    else
        eval "export ${1}=\"${2}\""
    fi
}

function prepend_to()
{
    remove_from "${1}" "${2}"
    [ -d "${2}" ] || return
    if [ -n "${!1}" ]
    then
        eval "export ${1}=\"${2}:${!1}\""
    else
        eval "export ${1}=\"${2}\""
    fi
}

1

তুষার থেকে গৃহীত উত্তর সম্পূর্ণ / উন্নত করতে, আপনি:

  • নন-স্ল্যাশ ডিলিমিটার ব্যবহার করে PATH এর স্ল্যাশগুলি থেকে বাঁচতে হবে
  • সেড ম্যান পৃষ্ঠা অনুসারে -eবিকল্পটি বাদ দিন : "যদি -e, --expression, -f, - --file বিকল্পটি দেওয়া হয়, তবে প্রথম অ-বিকল্প যুক্তিটি ব্যাখ্যা করার জন্য সেড স্ক্রিপ্ট হিসাবে নেওয়া হয়।"
  • gসমস্ত ঘটনা মুছে ফেলার জন্য (গ্লোবাল) পতাকা ব্যবহার করুন

শেষ পর্যন্ত, এটি এরকম কিছু দেয়:

PATH=$(echo "$PATH" | sed 's@:/home/wrong/dir$@@g')

0

বর্তমান উত্তরগুলি আমার অনুরূপ সমস্যাটি সমাধান করে না যে আমাকে একাধিক পাথ সরিয়ে ফেলতে হবে। এই সমস্ত পাথগুলি একটি একক ডিরেক্টরিের উপ ডিরেক্টরি। সেক্ষেত্রে, এই ওয়ান-লাইনারটি আমার পক্ষে কাজ করে: (ধরুন প্যাটার্নটি হ'ল cygwin, অর্থাত্ সমস্ত পাথ সরিয়ে ফেলা cygwin)

pattern=cygwin; export PATH=$(echo $PATH|tr ':' '\n'|sed "\#${pattern}#d" |tr '\n' ':')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.