"~" এর পদে পিডব্লিউডির ফলাফল তৈরি করবেন?


28

pwd আমাকে দেয়

/data/users/me/some/random/folder

প্রাপ্তির একটি সহজ উপায় আছে?

~/some/random/folder

pwdকোথা থেকে ?


সেড দিয়ে পাইপ দেওয়া কি বিকল্প?
ম্যাথু ডি স্কোলফিল্ড

7
যদি আপনি এটি করতে যাচ্ছেন তবে আমি ফলস্বরূপ কমান্ডের পরিবর্তে অন্য কিছু নামকরণের দৃ strongly়তার সাথে সুপারিশ করব pwd। অন্যথায়, আপনি এমন স্ক্রিপ্টগুলি ভেঙে ফেলবেন যা এর আউটপুটটিকে প্রাসঙ্গিক ক্ষেত্রে ব্যবহার করতে পারে যা টিল্ড সম্প্রসারণ না করে।
চার্লস ডাফি

উত্তর:


25

যদি আপনি বাশ ব্যবহার করছেন তবে dirsবিল্টিনের পছন্দসই আচরণ রয়েছে:

dirs +0
~/some/random/folder

(নোট +0, না-0 ।)

সাথে zsh:

dirs
~/some/random/folder

হুবহু হ'ল, আমাদের প্রথমে ডিরেক্টরি স্ট্যাকটি সাফ করা উচিত, অন্যথায় dirsসমস্ত সামগ্রী মুদ্রণ করা হবে:

dirs -c; dirs

বা zshএর printবিল্টিন সহ:

print -rD $PWD

অথবা

print -P %~

(যে এক সক্রিয় প্রম্পট সম্প্রসারণ করেন। %~এর মধ্যে $PS1বর্তমান ডিরেক্টরিতে বিস্তৃতি $HOMEদিয়ে প্রতিস্থাপিত ~কিন্তু অন্যান্য পরিচালনা নামে ডিরেক্টরি অন্যান্য ব্যবহারকারী বা ব্যক্তিগত ডিরেক্টরি মত নামে ডিরেক্টরি আপনি নিজেকে সংজ্ঞায়িত)।


আমি সব সময় বাশ এবং zsh এর মধ্যে স্যুইচ করি। দুর্ভাগ্যক্রমে এই সমাধান আমাকে শাঁসের মধ্যে পার্থক্যটি মনে করতে এবং আমি কোথায় রয়েছি তা মনে রাখতে (পরীক্ষা করতে) বাধ্য করে। @ বিচয়ের উত্তর হ'ল এই দু'জনের শেল-অজানাস্টিক।
এভিপি

18

আপনি ব্যাশ ভেরিয়েবল সাবস্ট্রিং প্রতিস্থাপন বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar

2
এই কাজ করে kshএবং zsh
মিঃ স্পুর্যাটিক

1
যদিও আমি এই উত্তরটিকে সহজতম উপায় হিসাবে চিহ্নিত করেছি, এখানে একটি ছোট ক্যাভিয়েট রয়েছে: ভিতরে / টিএমপি / হোম / ব্যবহারকারীর নাম, এটি ফিরে আসবে / টিএমপি ~ ~ এটি ঠিক করার জন্য I হোমের আগে আমি ক্যারেট সাইন প্রবেশের কোনও উপায় খুঁজে পাচ্ছি না। আপনার সমাধানটি যদি নিখুঁত হতে হয় তবে এটি ব্যবহার করবেন না ...
0fnt

1
এটি দেখানোর জন্য আপনার চেয়ে @ ব্যবহারকারী 18151। ${string/#substring/replacement}এই আচরণটি রোধ করতে আমি আমার উত্তরটি সংস্করণে প্রতিস্থাপন করেছি ।
Nykakin

1
@ মিঃ স্পুর্যাটিক এটি শুধুমাত্র সঠিক (এর ব্যবহার ব্যতীত echo) এর মধ্যে zsh। অন্যান্য শেলগুলিতে, $HOMEএকটি নিদর্শন হিসাবে বিবেচনা করা হবে এবং পুরো জিনিসটি বিভক্ত + গ্লোব সাপেক্ষে।
স্টাফেন চেজেলাস

টিলডে ('~') পাল্টানো কৌতুকটি করেছিল। নোট করুন যে ~ ~ এছাড়াও কাজ করে। ইতিমধ্যে 'অনুচ্ছেদে'র ক্ষেত্রে এটি সুবিধাজনক: উদাহরণস্বরূপPROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
আটফার

7

ব্যবহার sed:

pwd | sed "s|^$HOME|~|"

ধারণাটি হ'ল এমন কোনও চরিত্রকে ব্যবহার করা যা কোনও হোম ডিরেক্টরি sedপাথটিতে রেগেক্সের ডিলিমিটার হিসাবে কম দেখা যায় । উপরের উদাহরণে আমি ব্যবহার করছি |

এই কৌশল সম্পর্কে ভাল জিনিস এটি আসলে শেল-স্বতন্ত্র।

আপনি ব্যবহার করতে পারেন এমন অন্যান্য স্ক্রিপ্টগুলিতেও এই আচরণটি পেতে আপনি উপনাম pwdকরতে /bin/pwd | sed "s|$HOME|~|"পারেন pwd


2
আপনাকে ^আপনার রেজেক্সে অ্যাঙ্কর অন্তর্ভুক্ত করতে হবে । অন্যথায়, পথের মাঝখানে কোনও অংশটিকে প্রতিস্থাপন করা এটির পক্ষে সম্ভব (তবে অসম্ভব)।
সিলডোরথ

প্রকৃতপক্ষে রেজেক্সকে নিম্নলিখিত হিসাবে দেখা উচিত "s|^/home/user\(/.*\)\?$|~\1|"। অন্যথায় অন্য ব্যবহারকারীর পাথ সাথে মেলে যদি তাদের নাম মত user1, user2, user3এবং আপনি মেলেuser
AVP

3
tilde=\~${PWD#~}

আমি মনে করি আপনি কি চান?

টিলড সম্পর্কে ঝরঝরে কী যখন এটি একটি প্যাটার্ন হিসাবে প্রসারিত হয় যখন এর উদ্ধৃতি প্রয়োজন হয় না। $HOMEউদ্ধৃতি ব্যতীত একইভাবে ব্যবহার করা অপ্রত্যাশিত ফলাফলগুলি রেন্ডার করে কারণ এর উপাদানগুলির যে কোনও একটি চরিত্র প্যাটার্ন অক্ষর হতে পারে এবং তাই এটি সর্বদা প্রত্যাশিত ফলাফলটি রেন্ডার করতে পারে না।

তবে টিলডের সম্প্রসারণটি সর্বদাই ঘটে বলে মনে করা হয় যেন এটি কোনও উদ্ধৃত বিস্তারের ফলাফল এবং তাই এর ফলাফল অনুমানযোগ্য। এটি উভয়ই caseউল্লেখযোগ্য ব্যতিক্রম ksh93এবং mkshযে কারণেই হোক না কেন উভয় নিদর্শন এবং পরামিতি প্যাটার্নের জন্য আমি পরীক্ষামূলকভাবে প্রতিটি শেলকে সত্য বলে মনে করেছি - যার মধ্যে কোনওটিই সেই সক্ষমতাটিতে টিলডের উদ্ধৃত দিকটিকে সম্মান করে না বলে মনে হয়।

এ সম্পর্কে আরও একটি পরিষ্কার জিনিস আপনি $HOMEএকই ফ্যাশনে কোনও ডিরেক্টরি পরিচালনা করতে পুনরায় সংজ্ঞায়িত করতে পারেন । উদাহরণ স্বরূপ:

cd ~
HOME=/some/prefix/I/would/like/to/trim 
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD

এখানে আরও একটি উদাহরণ:

set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
      HOME=${*#~/}/$d
      set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~

1
এটি একটি সত্যিই আকর্ষণীয় পদ্ধতির। তবে এটি ধরে নিচ্ছে যে $PWDএর অধীনে রয়েছে $HOME। আপনি একই ধারণাটি প্যাটার্ন বিকল্পের সাথে মিলিয়ে আরও সাধারণ করে তুলতে পারেন। কেমন আছে ${PWD/#~/\~}?
মাইকেল

1
আসলে নাইকাকিনের উত্তরটি মূলত সেটাই।
মাইকেল

0

আপনি অযাচিত অংশটি এর সাথে প্রতিস্থাপনের চেষ্টা করতে পারেন sed:

pwd | sed 's,^/data/users/me,~,'

বা আরও ভাল:

pwd | sed "s,^$HOME,~,"

1
^ডিরেক্টরি পথের শুরুতে কেবল ম্যাচগুলি প্রতিস্থাপন করা হয়েছে তা নিশ্চিত করতে আপনাকে অ্যাঙ্কর ব্যবহার করতে হবে। এছাড়াও, আপনার ব্যবহার করার দরকার নেই gকারণ কমান্ডটি সর্বাধিক 1 টি ইভেন্টের পরিবর্তে হওয়া উচিত।
সিলডোরথ

ধন্যবাদ. আমি এখনও এই জিনিসগুলি শিখছি এবং আপনি মন্তব্য সত্যই সহায়ক।
ব্যবহারকারী1403360

সমস্যাটি যদি আমার হোম ডিরেক্টরি হয় /home/aliceএবং আমার বর্তমান ডিরেক্টরি হয় /home/aliceinchains। তবে আমি যখনই কেবলমাত্র বৈশিষ্ট্যটি ব্যবহার করতে চাই তা যখন আমি জানি যে আমি আমার হোম ডিরেক্টরি বা এর একটি উপ-ডিরেক্টরিতে রয়েছি, তবে এটির কাজ করা উচিত।
মিহাই ড্যানিলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.