मैन्युअल रूप से एक विशेष चर (उदा: ~ tilde) को bash में कैसे विस्तारित किया जाए


135

मेरी बैश स्क्रिप्ट में एक चर है जिसका मूल्य कुछ इस प्रकार है:

~/a/b/c

ध्यान दें कि यह अनएक्सपेन्डेड टिल्ड है। जब मैं इस चर पर ls-टाइप करता हूं (इसे $ VAR कहता हूं), मुझे ऐसी कोई निर्देशिका नहीं मिलती है। मैं इस वैरिएबल को व्याख्या / विस्तार नहीं करने देना चाहता हूं। दूसरे शब्दों में, मैं चाहता हूँ कि निष्कासन पर रोक लगाई जाए लेकिन मूल्यांकित आदेश को न चलाया जाए। क्या यह बाश में संभव है?

बिना विस्तार के मैंने इसे अपनी स्क्रिप्ट में कैसे पारित किया? मैंने इसे दोहरे उद्धरण चिह्नों के साथ पास करने में तर्क पारित किया।

इस कमांड को यह देखने की कोशिश करें कि मेरा क्या मतलब है:

ls -lt "~"

यह ठीक ऐसी स्थिति है, जिसमें मैं चाहता हूं। मैं चाहता हूं कि टिल्ड का विस्तार किया जाए। दूसरे शब्दों में, मुझे इन दोनों आदेशों को समान बनाने के लिए किस जादू की जगह लेनी चाहिए:

ls -lt ~/abc/def/ghi

तथा

ls -lt $(magic "~/abc/def/ghi")

ध्यान दें कि ~ / abc / def / ghi मौजूद हो सकता है या नहीं।


4
आपको टिल्ड का विस्तार उद्धरणों में भी मददगार लग सकता है। यह ज्यादातर है, लेकिन पूरी तरह से नहीं, का उपयोग करने से बचा जाता है eval
जोनाथन लेफ़लर

2
एक अनपेक्षित टिल्ड के साथ आपका चर कैसे सौंपा गया? हो सकता है कि सभी आवश्यक है कि उस चर के साथ बाहर के उद्धरण के साथ चर असाइन किया गया है। foo=~/"$filepath"याfoo="$HOME/$filepath"
चाड स्कीटर्स

dir="$(readlink -f "$dir")"
जैक वासी

जवाबों:


98

स्टैकऑवरफ्लो की प्रकृति के कारण, मैं इस उत्तर को अस्वीकार्य नहीं बना सकता, लेकिन जब से मैंने इसे पोस्ट किया है, तब से 5 साल के अंतराल में, यह मेरी अशिष्टता और सुंदर बुरे उत्तर की तुलना में कहीं बेहतर उत्तर हैं (मैं युवा था, इसे मत मारो मुझे)।

इस धागे में अन्य समाधान सुरक्षित और बेहतर समाधान हैं। अधिमानतः, मैं इन दोनों में से किसी एक के साथ जाऊँगा:


ऐतिहासिक उद्देश्यों के लिए मूल उत्तर (लेकिन कृपया इसका उपयोग न करें)

अगर मैं गलत नहीं हूँ, "~"तो उस तरीके से बैश स्क्रिप्ट का विस्तार नहीं किया जाएगा क्योंकि इसे शाब्दिक स्ट्रिंग के रूप में माना जाता है "~"। आप evalइस तरह के माध्यम से विस्तार को मजबूर कर सकते हैं ।

#!/bin/bash

homedir=~
eval homedir=$homedir
echo $homedir # prints home path

वैकल्पिक रूप से, ${HOME}यदि आप उपयोगकर्ता की होम डायरेक्टरी चाहते हैं तो बस उपयोग करें।


3
क्या आपके पास एक फ़र्क है जब चर में एक स्थान है?
ह्यूगो

34
मुझे ${HOME}सबसे आकर्षक लगा। क्या आपके प्राथमिक सिफारिश करने का कोई कारण नहीं है? किसी भी मामले में, धन्यवाद!
ऋषि

1
+1 - मुझे तब विस्तार करने की आवश्यकता थी जब $ HOME कुछ काम नहीं करेगा जब $ HOME काम नहीं करेगा क्योंकि मुझे वर्तमान उपयोगकर्ता के घर की आवश्यकता नहीं है।
ओलिवकोडर

11
का उपयोग करना evalएक भयानक सुझाव है, यह वास्तव में बहुत बुरा है कि इसे बहुत सारे उभार मिलते हैं। जब चर के मान में शेल मेटा वर्ण होते हैं, तो आप सभी प्रकार की समस्याओं में भाग लेंगे।
user2719058

1
मैं उस समय अपनी टिप्पणी समाप्त नहीं कर सका और, मुझे बाद में इसे संपादित करने की अनुमति नहीं मिली। इसलिए मैं इस समाधान के लिए आभारी हूं (@ फिर से @birryree) क्योंकि इसने उस समय मेरे विशिष्ट संदर्भ में मदद की। मुझे जागरूक करने के लिए धन्यवाद चार्ल्स।
ओलिवकोडर

114

यदि वैरिएबल varउपयोगकर्ता द्वारा इनपुट किया जाता है, तो इसका उपयोग करके टिल्ड का विस्तार करने के लिए उपयोग नहीं किया evalजाना चाहिए

eval var=$var  # Do not use this!

कारण यह है: उपयोगकर्ता var="$(rm -rf $HOME/)"संभावित विनाशकारी परिणामों के साथ उदाहरण के लिए दुर्घटना (या उद्देश्य से) टाइप कर सकता है ।

बैश पैरामीटर विस्तार का उपयोग करने के लिए एक बेहतर (और सुरक्षित) तरीका है:

var="${var/#\~/$HOME}"

8
आप ~ ~ के बजाय ~ उपयोगकर्ता नाम कैसे बदल सकते हैं?
aspergillusOryzae

3
का उद्देश्य क्या है #में "${var/#\~/$HOME}"?
जाहिद

3
@ जाहिद यह मैनुअल में समझाया गया है । यह टिल्ड को केवल शुरुआत में मैच के लिए मजबूर करता है $var
हेकॉन हॉलैंड

1
धन्यवाद। (१) हमें \~भागने की आवश्यकता क्यों है ~? (२) आपका उत्तर मानता है कि ~इसमें पहला चरित्र है $var। हम प्रमुख सफेद स्थानों को कैसे अनदेखा कर सकते हैं $var?
टिम

1
@ टिप्पणी के लिए धन्यवाद। हाँ, आप सही हैं, हमें एक टिल्ड से बचने की आवश्यकता नहीं है जब तक कि यह एक बिना तार वाले स्ट्रिंग का पहला वर्ण नहीं है या यह :किसी अनकहे स्ट्रिंग में अनुसरण कर रहा है । डॉक्स में अधिक जानकारी । अग्रणी सफेद स्थान को हटाने के लिए, बश चर से व्हॉट्सएप ट्रिम कैसे करें?
हेकॉन हॉलैंड

24

इससे जुड़े सुरक्षा जोखिमों के बिना मजबूती से करने के लिए, एक पूर्व उत्तर से खुद को अलग करना eval:

expandPath() {
  local path
  local -a pathElements resultPathElements
  IFS=':' read -r -a pathElements <<<"$1"
  : "${pathElements[@]}"
  for path in "${pathElements[@]}"; do
    : "$path"
    case $path in
      "~+"/*)
        path=$PWD/${path#"~+/"}
        ;;
      "~-"/*)
        path=$OLDPWD/${path#"~-/"}
        ;;
      "~"/*)
        path=$HOME/${path#"~/"}
        ;;
      "~"*)
        username=${path%%/*}
        username=${username#"~"}
        IFS=: read -r _ _ _ _ _ homedir _ < <(getent passwd "$username")
        if [[ $path = */* ]]; then
          path=${homedir}/${path#*/}
        else
          path=$homedir
        fi
        ;;
    esac
    resultPathElements+=( "$path" )
  done
  local result
  printf -v result '%s:' "${resultPathElements[@]}"
  printf '%s\n' "${result%:}"
}

...इसके समान इस्तेमाल किया...

path=$(expandPath '~/hello')

वैकल्पिक रूप से, एक सरल दृष्टिकोण जो evalसावधानी से उपयोग करता है:

expandPath() {
  case $1 in
    ~[+-]*)
      local content content_q
      printf -v content_q '%q' "${1:2}"
      eval "content=${1:0:2}${content_q}"
      printf '%s\n' "$content"
      ;;
    ~*)
      local content content_q
      printf -v content_q '%q' "${1:1}"
      eval "content=~${content_q}"
      printf '%s\n' "$content"
      ;;
    *)
      printf '%s\n' "$1"
      ;;
  esac
}

4
अपने कोड को देखकर ऐसा लगता है जैसे आप किसी मच्छर को मारने के लिए तोप का उपयोग कर रहे हैं। वहाँ मिल गया एक बहुत सरल तरीका ..
गीनो

2
@Gino, वहाँ निश्चित रूप से एक सरल तरीका है; सवाल यह है कि क्या कोई सरल तरीका है जो सुरक्षित भी है।
चार्ल्स डफी

2
@Gino, ... मैं है लगता है कि एक का उपयोग कर सकते हैं printf %qसब कुछ लेकिन टिल्ड से बचने के लिए, और उसके बाद का उपयोग evalजोखिम के बिना।
चार्ल्स डफी

1
@Gino, ... और इसलिए लागू किया गया।
चार्ल्स डफी

3
सुरक्षित, हाँ, लेकिन बहुत अधूरा। मेरा कोड इसके मज़े के लिए जटिल नहीं है - यह जटिल है क्योंकि टिल्ड विस्तार द्वारा किए गए वास्तविक संचालन जटिल हैं।
चार्ल्स डफी

10

Eval का उपयोग करने का एक सुरक्षित तरीका है "$(printf "~/%q" "$dangerous_path")"। ध्यान दें कि बैश विशिष्ट है।

#!/bin/bash

relativepath=a/b/c
eval homedir="$(printf "~/%q" "$relativepath")"
echo $homedir # prints home path

देखें इस सवाल जानकारी के लिए

इसके अलावा, ध्यान दें कि zsh के तहत यह उतना ही सरल होगा जितना कि echo ${~dangerous_path}


echo ${~root}मुझे zsh पर कोई आउटपुट न दें (mac os x)
Orwellophile

export test="~root/a b"; echo ${~test}
ग्यूकोस जूल

9

इस बारे में कैसा है:

path=`realpath "$1"`

या:

path=`readlink -f "$1"`

अच्छा लग रहा है, लेकिन realpath मेरे मैक पर मौजूद नहीं है। और आपको पथ = $ (realpath "$ 1") लिखना होगा
ह्यूगो

हाय @ हगू। आप अपनी खुद की realpathकमांड सी में संकलित कर सकते हैं । उदाहरण के लिए, आप इस कमांड लाइन से बैश और जीसीसीrealpath.exe का उपयोग करके एक निष्पादन योग्य उत्पन्न कर सकते हैं :। चीयर्सgcc -o realpath.exe -x c - <<< $'#include <stdlib.h> \n int main(int c,char**v){char p[9999]; realpath(v[1],p); puts(p);}'
ओलिब्रे

@Quuxplusone सही नहीं है, कम से कम linux पर: realpath ~->/home/myhome
BlueFast

iv'e मैक पर काढ़ा के साथ यह प्रयोग किया जाता
nhed

1
@dangonfast यदि आप टिल्ड को उद्धरण में सेट करते हैं तो यह काम नहीं करेगा, परिणाम है <workingdir>/~
मर्फी

7

बिर्री के और हेल्लू के उत्तरों पर विस्तार (कोई उद्देश्य नहीं): सामान्य दृष्टिकोण का उपयोग करना है eval, लेकिन यह >चर में कुछ महत्वपूर्ण कैविटीज़, अर्थात् रिक्त स्थान और आउटपुट पुनर्निर्देशन ( ) के साथ आता है । निम्नलिखित मेरे लिए काम करता है:

mypath="$1"

if [ -e "`eval echo ${mypath//>}`" ]; then
    echo "FOUND $mypath"
else
    echo "$mypath NOT FOUND"
fi

निम्न तर्कों में से प्रत्येक के साथ इसे आज़माएँ:

'~'
'~/existing_file'
'~/existing file with spaces'
'~/nonexistant_file'
'~/nonexistant file with spaces'
'~/string containing > redirection'
'~/string containing > redirection > again and >> again'

व्याख्या

  • ${mypath//>}बाहर स्ट्रिप्स >पात्रों जिसके दौरान एक फ़ाइल मार सकता है eval
  • eval echo ...क्या वास्तविक टिल्ड विस्तार करता है
  • -eतर्क के आसपास डबल-कोट्स रिक्त स्थान के साथ फ़ाइल नाम के समर्थन के लिए हैं।

शायद वहाँ एक और अधिक सुंदर समाधान है, लेकिन यह वही है जो मैं साथ आने में सक्षम था।


3
आप युक्त नामों के साथ व्यवहार को देखने पर विचार कर सकते हैं $(rm -rf .)
चार्ल्स डफी

1
क्या यह उन रास्तों पर नहीं टूटता >, जिनमें वास्तव में चरित्र होते हैं, हालांकि?
रेडॉन रोसबोरो

2

मेरा मानना ​​है कि यह वही है जो आप खोज रहे हैं

magic() { # returns unexpanded tilde express on invalid user
    local _safe_path; printf -v _safe_path "%q" "$1"
    eval "ln -sf ${_safe_path#\\} /tmp/realpath.$$"
    readlink /tmp/realpath.$$
    rm -f /tmp/realpath.$$
}

उदाहरण उपयोग:

$ magic ~nobody/would/look/here
/var/empty/would/look/here

$ magic ~invalid/this/will/not/expand
~invalid/this/will/not/expand

मुझे आश्चर्य है कि प्रमुख टिल्डों से बच printf %q नहीं है - इसे बग के रूप में दर्ज करना लगभग लुभावना है, क्योंकि यह एक ऐसी स्थिति है जिसमें यह किसी भी उद्देश्य से विफल रहता है। हालांकि, अंतरिम में, एक अच्छी कॉल!
चार्ल्स डफी

1
वास्तव में - यह बग 3.2.57 और 4.3.18 के बीच किसी बिंदु पर तय किया गया है, इसलिए यह कोड अब काम नहीं करता है।
चार्ल्स डफी

1
अच्छा बिंदु, मैंने कोड को समायोजित करने के लिए समायोजित कर लिया है यदि यह मौजूद है, तो सभी निश्चित और काम किए गए :) मैं तर्कों को उद्धृत किए बिना परीक्षण कर रहा था, इसलिए यह फ़ंक्शन को कॉल करने से पहले विस्तारित हो रहा था।
ऑरवेलोफाइल

1

यहाँ मेरा समाधान है:

#!/bin/bash


expandTilde()
{
    local tilde_re='^(~[A-Za-z0-9_.-]*)(.*)'
    local path="$*"
    local pathSuffix=

    if [[ $path =~ $tilde_re ]]
    then
        # only use eval on the ~username portion !
        path=$(eval echo ${BASH_REMATCH[1]})
        pathSuffix=${BASH_REMATCH[2]}
    fi

    echo "${path}${pathSuffix}"
}



result=$(expandTilde "$1")

echo "Result = $result"

इसके अलावा, echoइसका मतलब है कि expandTilde -nउम्मीद के मुताबिक व्यवहार नहीं किया जा रहा है, और बैकस्लैम वाले फ़ाइलनाम के साथ व्यवहार पॉसिक्स द्वारा अपरिभाषित है। Pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
चार्ल्स डफी

अच्छी पकड़। मैं आम तौर पर एक-उपयोगकर्ता मशीन का उपयोग करता हूं इसलिए मैंने उस मामले को संभालने के लिए नहीं सोचा था। लेकिन मुझे लगता है कि दूसरे के लिए / etc / passwd फ़ाइल के माध्यम से पकड़कर इस अन्य मामले को संभालने के लिए फ़ंक्शन को आसानी से बढ़ाया जा सकता है। मैं इसे किसी और के लिए एक अभ्यास के रूप में छोड़ दूँगा :)।
गीनो

मैंने पहले ही उस अभ्यास को कर दिया है (और OLDPWD केस और अन्य को संभाल लिया है) एक उत्तर में आपने बहुत जटिल समझा। :)
चार्ल्स डफी

वास्तव में, मुझे बस एक काफी सरल एक-लाइन समाधान मिला, जिसे दूसरे मामले को संभालना चाहिए: पथ = $ (eval echo $ orgPath)
गीनो

1
FYI करें: मैंने अभी-अभी अपना समाधान अपडेट किया है ताकि यह अब ~ यूज़रनेम को सही ढंग से संभाल सके। और, यह काफी सुरक्षित भी होना चाहिए। यदि आप एक तर्क के रूप में '/ tmp / $ (rm -rf / *)' डालते हैं, तो भी इसे इनायत से संभालना चाहिए।
गीनो

1

बस evalसही ढंग से उपयोग करें : सत्यापन के साथ।

case $1${1%%/*} in
([!~]*|"$1"?*[!-+_.[:alnum:]]*|"") ! :;;
(*/*)  set "${1%%/*}" "${1#*/}"       ;;
(*)    set "$1" 
esac&& eval "printf '%s\n' $1${2+/\"\$2\"}"

यह शायद सुरक्षित है - मुझे ऐसा कोई मामला नहीं मिला जिसके लिए यह विफल हो। उस ने कहा, अगर हम "सही ढंग से" का उपयोग करने के लिए बोलने जा रहे हैं, तो मैं तर्क दूंगा कि ऑरवेलोफाइल का जवाब बेहतर अभ्यास का अनुसरण करता है: मुझे विश्वास है कि शेल की printf %qचीजों को सुरक्षित रूप से भागने के लिए अधिक से अधिक मैं भरोसा करता हूं कि हाथ से लिखे सत्यापन कोड पर कोई बग नहीं है। ।
चार्ल्स डफी

@Charles डफी - यह मूर्खतापूर्ण है। शेल में% q नहीं हो सकता है - और printfएक $PATH'd कमांड है।
15

1
क्या यह प्रश्न टैग नहीं किया गया है bash? यदि ऐसा है, तो printfएक बिलिन है, और %qमौजूद रहने की गारंटी है।
चार्ल्स डफी

@Charles डफी - क्या संस्करण?
15

1
@Charles डफी - यह ... बहुत जल्दी। लेकिन मुझे अभी भी यह अजीब लगता है कि आप अपनी आंखों के ठीक सामने एक% q से अधिक arg पर भरोसा करेंगे, ive इस पर भरोसा करने के लिए नहींbash जानने के लिए पहले पर्याप्त उपयोग किया । कोशिश:x=$(printf \\1); [ -n "$x" ] || echo but its not null!
mikeserv

1

यहाँ POSIX फ़ंक्शन Håkon Hlandgland के Bash उत्तर के बराबर है

expand_tilde() {
    tilde_less="${1#\~/}"
    [ "$1" != "$tilde_less" ] && tilde_less="$HOME/$tilde_less"
    printf '%s' "$tilde_less"
}

2017-12-10 संपादित करें: '%s'टिप्पणियों में प्रति @CharlesDuffy जोड़ें ।


1
printf '%s\n' "$tilde_less", शायद? यदि फ़ाइल नाम का विस्तार किया जा रहा है तो बैकस्लैश %s, या अन्य सिंटैक्स सार्थक होगा, अन्यथा यह गलत व्यवहार करेगा printf। इसके अलावा, हालांकि, यह एक शानदार उत्तर है - सही (जब bash / ksh एक्सटेंशन को कवर करने की आवश्यकता नहीं है), जाहिर है सुरक्षित (साथ कोई mucking नहीं eval) और टोन।
चार्ल्स डफी

1

क्यों सीधे उपयोगकर्ता के होम डायरेक्टरी को प्राप्त करने में देरी न करें?

$ getent passwd mike | cut -d: -f6
/users/mike

0

रिक्त स्थान के साथ पथों के लिए बिर्री के उत्तर का विस्तार करने के लिए : आप evalकमांड का उपयोग नहीं कर सकते क्योंकि यह रिक्त स्थान द्वारा मूल्यांकन को अलग करता है। एक समाधान रिक्त स्थान के लिए अस्थायी रूप से रिक्त स्थान को बदलना है:

mypath="~/a/b/c/Something With Spaces"
expandedpath=${mypath// /_spc_}    # replace spaces 
eval expandedpath=${expandedpath}  # put spaces back
expandedpath=${expandedpath//_spc_/ }
echo "$expandedpath"    # prints e.g. /Users/fred/a/b/c/Something With Spaces"
ls -lt "$expandedpath"  # outputs dir content

यह उदाहरण निश्चित रूप से उस धारणा पर निर्भर करता है mypathजिसमें चार क्रम नहीं होते हैं "_spc_"


1
टैब के साथ काम नहीं करता है, या newlines, या IFS में कुछ और ... और पथ प्रदर्शकों जैसे सुरक्षा प्रदान नहीं करता है जिसमें युक्त पथ शामिल हैं$(rm -rf .)
चार्ल्स डफी

0

आपको अजगर में ऐसा करने में आसानी हो सकती है।

(1) यूनिक्स कमांड लाइन से:

python -c 'import os; import sys; print os.path.expanduser(sys.argv[1])' ~/fred

का परिणाम:

/Users/someone/fred

(2) बैश स्क्रिप्ट के भीतर एक-बंद के रूप में - इसे इस प्रकार सहेजें test.sh:

#!/usr/bin/env bash

thepath=$(python -c 'import os; import sys; print os.path.expanduser(sys.argv[1])' $1)

echo $thepath

चल रहे bash ./test.shपरिणाम:

/Users/someone/fred

(3) एक उपयोगिता के रूप में - इसे expanduserअपने रास्ते पर कहीं और सहेजें , निष्पादन की अनुमति के साथ:

#!/usr/bin/env python

import sys
import os

print os.path.expanduser(sys.argv[1])

यह तब कमांड लाइन पर इस्तेमाल किया जा सकता है:

expanduser ~/fred

या एक स्क्रिप्ट में:

#!/usr/bin/env bash

thepath=$(expanduser $1)

echo $thepath

या पायथन में केवल '~' पास करने के बारे में, "घर / फ्रेड" लौटने के बारे में कैसे?
टॉम रसेल

1
गरजते हुए बोली। echo $thepathछोटी गाड़ी है; होने की जरूरत है echo "$thepath", या, (globs उन्हें विस्तार होने के साथ नाम टैब या रिक्त स्थान की रन के साथ नाम एक रिक्त स्थान के लिए परिवर्तित किया जा रहा है) कम असामान्य मामलों ठीक करने के लिए printf '%s\n' "$thepath"। एक फ़ाइल का नाम भी असामान्य लोगों को ठीक करने (यानी -n, या के साथ एक फ़ाइल एक XSI अनुरूप प्रणाली पर बैकलैश शाब्दिक)। इसी तरह,thepath=$(expanduser "$1")
चार्ल्स डफी

... यह समझने के लिए कि बैकस्लैश शाब्दिक के बारे में मेरा क्या मतलब है, pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html देखें - POSIX echoपूरी तरह से कार्यान्वयन-परिभाषित तरीके से व्यवहार करने की अनुमति देता है अगर किसी में बैकस्लैश हो; ऐसे नामों के लिए POSIX जनादेश डिफ़ॉल्ट (कोई -eया -Eआवश्यक) विस्तार व्यवहार के लिए वैकल्पिक XSI एक्सटेंशन नहीं है ।
चार्ल्स डफी

0

सरलतम : 'जादू' को 'एवल इको' से बदलें।

$ eval echo "~"
/whatever/the/f/the/home/directory/is

समस्या: आप अन्य चर के साथ मुद्दों में चलाने जा रहे हैं क्योंकि eval बुराई है। उदाहरण के लिए:

$ # home is /Users/Hacker$(s)
$ s="echo SCARY COMMAND"
$ eval echo $(eval echo "~")
/Users/HackerSCARY COMMAND

ध्यान दें कि इंजेक्शन का मुद्दा पहले विस्तार पर नहीं होता है। इसलिए यदि आप बस के magicसाथ बदलने के लिए थे eval echo, तो आपको ठीक होना चाहिए। लेकिन अगर आप ऐसा करते हैं echo $(eval echo ~), तो यह इंजेक्शन के लिए अतिसंवेदनशील होगा।

इसी तरह, यदि आप इसके eval echo ~बजाय करते हैं, तो eval echo "~"यह दो बार विस्तारित होगा और इसलिए इंजेक्शन तुरंत संभव होगा।


1
आपने जो कहा उसके विपरीत, यह कोड असुरक्षित है । उदाहरण के लिए, परीक्षण s='echo; EVIL_COMMAND'। (यह विफल हो जाएगा क्योंकि EVIL_COMMANDआपके कंप्यूटर पर मौजूद नहीं है। लेकिन यदि वह rm -r ~उदाहरण उदाहरण के लिए था, तो इससे आपकी होम डायरेक्टरी डिलीट हो जाती।)
कोनराड रुडोल्फ

0

मैंने पठनीय (दूसरों के बीच) का उपयोग करके पथ में पढ़ने के बाद चर पैरामीटर प्रतिस्थापन के साथ ऐसा किया है। तो उपयोगकर्ता पथ को टैब-पूर्ण कर सकता है, और यदि उपयोगकर्ता एक ~ पथ में प्रवेश करता है तो वह क्रमबद्ध हो जाता है।

read -rep "Enter a path:  " -i "${testpath}" testpath 
testpath="${testpath/#~/${HOME}}" 
ls -al "${testpath}" 

अतिरिक्त लाभ यह है कि अगर कोई टिल्ड नहीं होता है तो वैरिएबल में कुछ भी नहीं होता है, और यदि कोई टिल्ड होता है, लेकिन पहली स्थिति में इसे नजरअंदाज नहीं किया जाता है।

(मैं पढ़ने के लिए -i शामिल करता हूं क्योंकि मैं इसे एक लूप में उपयोग करता हूं ताकि उपयोगकर्ता कोई समस्या होने पर रास्ता ठीक कर सके।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.