কমান্ড লাইন থেকে আমি কীভাবে শেষ আউটপুটটি পুনরায় ব্যবহার করব?


43

আমি কনসোল থেকে শেষ আউটপুটটি কীভাবে পুনরায় ব্যবহার করতে পারি তা জানতে চাই:

pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/Library/Python/2.6/site-packages
pv-3:method Xavier$ cd **LASTOUTPUT**

7
আপনি পারবেন না; এখানে কিছু পটভূমি ব্যাখ্যা আছে । আপনার সেরা বাজি হ'ল কমান্ডটি আবার চালানো, যেমন এখন পর্যন্ত পোস্ট করা দুটি উত্তরে দেখা গেছে।
গিলস

আপনি যেমন সরাসরি কোনও ডিভাইসে প্রেরিত আউটপুট ক্যাপচার করতে পারবেন না /dev/tty, তবে প্রেরিত stdoutবা stderrযেটি পর্যাপ্ত হতে পারে এমন কোনও কিছুই ক্যাপচার করা সম্ভব ।
মিকেল

@ গিলস - যদি না আপনি @ ম্যাটডেমের উত্তরটি অবশ্যই ব্যবহার না করেন!
সাইমন

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

উত্তর:


39

ধরে নেওয়া বাশ:

% python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.7/site-packages
% cd $(!!)
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
% pwd
/usr/lib/python2.7/site-packages

1
ধন্যবাদ! টাইপ করা খুব সহজ নয় তবে এটি মাউসের জন্য যাচ্ছে be
পদ্ধতিটি

2
আপনি $ () এর পরিবর্তে ব্যাকটিকগুলিও ব্যবহার করতে পারেন (যা আমি কীভাবে এই ইন্টারফেসটিকে উইকিফাই না করব তা আমি বুঝতে পারি না) তবে আমি খুঁজে পেয়েছি যে ব্যাকটিক-শিফট -১-শিফট -১-ব্যাকটিকটি আঘাত করা আমার পক্ষে অস্বস্তিকর , এবং আমি পড়ার যোগ্যতার জন্য যখন সম্ভব তখন $ () ব্যবহার করার অভ্যাসে প্রবেশ করার চেষ্টা করছি।
jsbillings

@jsbillings নীচে আমার উত্তর দেখুন। আমি উত্তরে display display প্রদর্শন করতে typ টাইপ করেছি। এবং '\' প্রদর্শন করতে, যথারীতি '' 'টাইপ করুন।
ইয়াসৌসার

3
+1 আমি ভাবছি কীভাবে বাসা বাঁধবে `backtick-commands`! cd $(dirname $(which python))এইতো আমি এসেছি!
এড ব্রান্নিন

21
কেবল একটি নোট, মনে রাখবেন এটি কমান্ডটি পুনরায় চালাচ্ছে। যদি আপনার কমান্ডের পার্শ্ব প্রতিক্রিয়া থাকে তবে এটি আপনার পক্ষে কাজ করবে না।
ধনী হোমোলকা

13

এখনও উল্লেখ করা হয়নি, একটি ভেরিয়েবল ব্যবহার করুন:

dir=$( python -c ... )
cd "$dir"

3
যথাযথভাবে। এটি একটি শাঁস হওয়ার কারণে, লোকেরা প্রায়শই বাশ সরবরাহ করে এমন ভাষা বৈশিষ্ট্যগুলি ভুলে যায়, যেমন লুপ এবং অ্যাসাইনমেন্ট।
ইভান

কেবলমাত্র বলতে পারেনcd $dir
অস্থায়ী_ ব্যবহারকারী_নাম

3
অ্যারোভিস্টে, মানগুলি কোথা থেকে এসেছে তা আপনি যদি না জানেন তবে কোটগুলি আবশ্যক:
গ্লেন জ্যাকম্যান ২

@ বিগেন, (আমি জানি এটি পুরো অন্যান্য প্রশ্ন হতে পারে, তবে উত্তরটি যদি সংক্ষিপ্ত হয় :) আপনি আরও ব্যাখ্যা করতে পারবেন / এমন উদাহরণ প্রদান করতে পারেন যেখানে কোট ব্যবহার না করে জিনিসগুলি ভেঙে যায়?
আলেক্সি

2
ক্যানোনিকাল ব্যাখ্যা হ'ল unix.stackexchange.com
গ্লেন জ্যাকম্যান

8

অন্যান্য সমস্ত সমাধানগুলির মধ্যে আপনার ওয়ার্কফ্লো পরিবর্তন করতে বা কমান্ডটি দু'বার চালানো জড়িত যা এটি চালাতে বেশিক্ষণ সময় নেয়, বা পুনরাবৃত্তযোগ্য নয় (উদাহরণস্বরূপ এটি একটি ফাইল মুছে ফেলে - এটি পুনরায় পুনরায় সাজানো একটি আলাদা ফলাফল তৈরি করে)।

সুতরাং আপনার যদি এটির প্রয়োজন হয় তবে এটি আরও জটিল ধারণা:

.bashrc

exec > >(tee -a ~/$$.out)

PROMPT_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)'

trap 'rm ~/$$.out' EXIT

বাশ প্রম্পট

$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.6/dist-packages
$ cd $LASTLINE
$ pwd
/usr/lib/python2.6/dist-packages

এটিতে কিছু সমস্যা রয়েছে, সুতরাং এটি কেবল একটি সূচনা পয়েন্ট হিসাবে বোঝানো হচ্ছে। উদাহরণস্বরূপ, আউটপুট ফাইল ( ~/<pid>.out) খুব বড় হতে পারে এবং আপনার ডিস্কটি পূরণ করতে পারে। এছাড়াও, আপনার পুরো শেলটি teeমারা গেলে কাজ করা বন্ধ করতে পারে ।

এটি কেবল পূর্ববর্তী কমান্ড preexecএবং precmdজেডএসে হুক ব্যবহার করে বা আটকালে বা তার একটি অনুকরণ ব্যবহার করে আউটপুট ক্যাপচার করতে পারে তবে এটি এখানে বর্ণনা করা আরও জটিল।


6
প্রাথমিক ধারণাটি ভাল, তবে বাস্তবায়ন হয় না। শেল সেশনে স্ট্যান্ডার্ড আউটপুটটি টার্মিনাল নয় বরং একটি পাইপ, যার ফলে কিছু প্রোগ্রাম আলাদাভাবে আচরণ করে। Stdout লিখতে এবং stderr লিখতে বা tty- তে সরাসরি লেখার মধ্যে কোনও সমন্বয় হবে না, উদাহরণস্বরূপ আপনি পরবর্তী কমান্ডের পরে কমান্ড আউটপুট প্রদর্শিত হতে পারে। আপনি teeসিগন্যালগুলি থেকেও সুরক্ষা পাননি ( Ctrl+Cআরও কয়েকটি কমান্ড টিপতে এবং চালানোর চেষ্টা করুন )। scriptইউটিলিটিটি ব্যবহার করুন যার মধ্যে এই সমস্যাগুলির কোনওটিই নেই।
গিলস 21'12

জানা ভাল! আমি এখনও আমার কমান্ড লাইনের বেসিকগুলিতে কাজ করছি তাই এটি সম্ভবত আমার পক্ষে একটি ওভারকিল, প্লাস যে কোনও কম্পিউটারে এটি ব্যবহার করতে সক্ষম হতে চাই, তবে আমি যদি কখনও ভাল স্তরে পৌঁছায় তবে আমি এটি মনে রাখব।
পদ্ধতিটি

8

একটি traditionalতিহ্যবাহী শেলের জন্য একটি কার্যকরী খসড়া:

ttyid=$(readlink /proc/$$/fd/1)
\___/   \______/ \___/ |  |  |
  |         |      |   |  |  \- 0: stdin 
  |         |      |   |  |     1: stdout <- our interest
  |         |      |   |  |     2: stderr
  |         |      |   |  \- fd is, maybe, filedescriptor
  |         |      |   |
  |         |      |   \- $$ is the PID of the current process (shell,
  |         |      |      in our case)
  |         |      |
  |         |      \- you know, much runtime stuff is here
  |         |
  |         \- readlink extracts the symbolic link of /proc/$$/fd/1
  |            lrwx------ 1 stefan stefan 64 2011-03-18 09:11
  |            /proc/22159/fd/1 -> /dev/pts/4
  |
  \- /dev/tty3 for real shell, /dev/pts/3 for xterm

এখন আমরা একটি ফাইল স্ক্রিন বিড়াল করতে পারেন। সুডো দরকার।

id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump

অ্যাপ্রোপস screendump: তথাকথিত প্রোগ্রামটি আমার পক্ষে আর কাজ করে না। সম্ভবত শুধুমাত্র পুরানো কার্নেলের জন্য। / dev / pts / N আমার পক্ষেও কাজ করে না। হতে পারে আপনি আছে কিছু ঐচ্ছিক MKDEV / dev - আমি রহস্যময়ভাবে কয়েকটির বিষয়ে মনে রাখা /dev/cuaN, কিন্তু আমি ভুল হতে পারে।

আমরা স্ক্রিন.ডাম্প ব্যবহার না করে আউটপুটটি পাইপ করতে চাই। তবে কোনওভাবে এটি কাজ করে না - কখনও কখনও এটি ENTER এর জন্য অপেক্ষা করে।

ক্যাপচারিং লাইনফিডগুলির সাথে একটি সাধারণ পাঠ্য ফাইল নয়, তবে - উদাহরণস্বরূপ - এক অনুক্রমের 80x50 অক্ষর।

কমান্ডের আউটপুট জন্য সর্বশেষ 2 লাইন, 1 এবং প্রম্প্টিং লাইনের জন্য বাছাই করার জন্য, আমি এটি পুনরায় ফিরিয়ে আনব, 160 অক্ষর বাছাই করব, আবার ফিরে আসব এবং 80 বেছে নেব।

rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'

আপনি যদি কখনও ভেবে থাকেন তবে কেন একটি revপ্রোগ্রাম আছে।

সমালোচনা:

  • প্রথম কমান্ড প্রবেশ করা হয়, এভাবে রেখাটি সরানো হয় hed ভাল - 3 য়-শেষ লাইন বা কিছু বাছাইয়ের জন্য কেবল একটি সংখ্যাসূচক অংশ cer আমি মূলত একটি ভিন্ন উইন্ডোতে কাজ করেছি।
  • প্রত্যেকেরই 80x50 স্ক্রিন থাকে না। হ্যাঁ, আমরা জানি। আপনার আনন্দের জন্য $ COLUMNS এবং $ ROWS রয়েছে।
  • আউটপুট নীচে সর্বদা হয় না। একটি নতুন এবং তরুণ শেল উপরের সারিগুলিতে থাকতে পারে। ভাল - হিসাবে সহজ: কোন শেল চলছে তা মূল্যায়ন করুন। কোন প্রম্পট ব্যবহার করা হয়। কিছু প্রম্পট সনাক্তকরণ করুন এবং শেল-প্রম্পটের সাহায্যে শেষ লাইনটি সন্ধান করুন। আগের (বা 2. আগে) লাইনে ডিরেক্টরি থাকতে হবে।

প্রথম চিত্রটি ব্যাখ্যা.পি দিয়ে তৈরি করা হয়েছে


+1, আমাকে alias tee2tty='tee $(readlink /proc/$$/fd/1)'
করিয়েছে

7

এটা চেষ্টা কর:

$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages

6

সুতরাং, আহ, এখানে একটি উত্তর:

যদি আপনি X এর অধীনে চলেছেন তবে মাউসটি অনুলিপি করতে চান এমন আউটপুট নির্বাচন করুন এবং তারপরে এটি আটকানোর জন্য মিডল ক্লিক করুন।

আপনি যদি কোনও পাঠ্য কনসোল চালিয়ে যাচ্ছেন তবে আপনি জিপিএম দিয়ে একই জিনিস করতে পারেন ।


1
+1 - ভাল উত্তর! আপনি জিএনইউ স্ক্রিন ( gnu.org/software/screen ) ব্যবহার করে এক্স চালাচ্ছেন না, আপনি একই জিনিস অর্জন করতে পারেন ।
সাইমন

1
এটি এতটাই সুস্পষ্ট বলে মনে হয়েছিল যে আমি এটি বলতে দ্বিধা বোধ করছিলাম। তবে বাকি সবাই এত চালাক হয়ে ব্যস্ত। :)
ম্যাচটিএম

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

@ সিমন: আসলে আমার উত্তর দেয় না। উভয়ই গ্লেনস দেয় না।
মাইকেল

@ মাইকেল: সত্য, তবে তাদের আপনার আগে থেকে কিছু করা দরকার বা প্রথমবার সঠিকভাবে করা উচিত।
ম্যাটডেম

1

(দুর্ভাগ্যক্রমে এটি কোনও কার্যকরী উত্তর নয়, তবে এখনও উত্সাহী কিছু।

ইন eshellএ গিয়ে Emacs ভিতরে, তারা এমন একটি বৈশিষ্ট্য চেয়েছিলেন কিন্তু এটি একটি সম্পূর্ণ উপায় (যা অবশ্য হয় বাস্তবায়িত না ডকুমেন্টেশন প্রতিফলিত )।

উদাহরণ স্বরূপ:

~ $ pwd
~
~ $ /bin/echo $$
~
~ $ /bin/pwd
/home/imz
~ $ /bin/echo $$

~ $ 

আপনি দেখতে পাচ্ছেন, কেবল বিল্টিনগুলির আউটপুট $$পরিবর্তনশীলতে ক্যাপচার করা যায় ।

তবে ভাল, কিছু এলিস্প প্রোগ্রামিং ( eshell-mark-output"এশ-মোড.এল" তে সিএফ। বাস্তবায়ন), এবং আপনি এমন একটি ফাংশন প্রয়োগ করতে পারেন যা শেষ আউটপুটটিকে "চিহ্নিত" করে এবং ফাংশনটির ফলাফল হিসাবে এটি প্রদান করে; যাতে আপনি যে ফাংশনটি আপনি জিজ্ঞাসা করছেন একটি এসেল কমান্ডটিতে ব্যবহার করতে পারেন - এলিস্প ফাংশনগুলি সাধারণ এলিস্প সিনট্যাক্স সহ এসেল কমান্ডগুলিতে ব্যবহার করা যেতে পারে, যেমন বন্ধনীতে, এর মতো:

~ $ /bin/echo (buffer-name)
*eshell*
~ $ /bin/echo (car '(a b c))
a
~ $ 

0

আপনি যদি বুঝতে পারেন যে আঘাতের আগে আপনি আউটপুটটি পুনরায় ব্যবহার করতে চান Enter, আপনি এটি একটি পরিবর্তনশীলে সংরক্ষণ করতে পারেন: tmp=$(লাইনের শুরুতে এবং )শেষে যুক্ত করুন। (এটি কমান্ড আউটপুট শেষে যে কোনও ফাঁকা রেখা সরিয়ে দেয় এবং বাস্তবে কোনও চূড়ান্ত নতুন লাইন সরিয়ে দেয়; এটি খুব কমই গুরুত্বপূর্ণ)

tmp=$(python -c )
echo "$tmp"
cd "$tmp"

যদি আপনার শেলটি ksh বা zsh হয় তবে আপনি এখানে আরও কার্যকর করতে ব্যবহার করতে পারেন একটি কার্যকর ফাংশন। (এটি বাশে কোনও সহায়তা নেই কারণ এটি পিনেন্ট শেলের মধ্যে চালিত করার জন্য পাইপলাইনে শেষ কমান্ডের প্রয়োজন হয়, যা কেবল ksh (pdksh নয়) এবং zsh এর ক্ষেত্রে হয়))

keep () {
  local line IFS=$'\n'
  kept=
  while read -r line; do
    printf '%s\n' "$line"
    kept=$kept$line$IFS
  done
}
alias keep=k

এটি এইভাবে ব্যবহার করুন:

python -c  |k
cd $kept

0
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1))

( 4485 এর উত্তরে বিল্ডিং )

এটি প্রচুর টাইপিং, তাই একটি উপাধি করুন:

alias tee2tty='tee $(readlink /proc/$$/fd/1)'

তারপরে কেবল কল করুন cd $(python -c ... | tee2tty)

এই আউটপুটটি নিয়ে আপনি কী করতে চান তা অবশ্যই আপনার ইতিমধ্যে জেনে রাখা দরকার তবে কেবল একবার কমান্ড কল করার সুবিধা রয়েছে।


0
$ cd \`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"\`

কৌতুক করবে

আরও বিশদের জন্য এখানে পড়ুন: কমান্ড প্রতিস্থাপন


1
arumug: বাহামাত ইতিমধ্যে প্রায় একই উত্তর পোস্ট করেছে । কমান্ডটিতে ইতিমধ্যে ব্যাকটিকস থাকলে ব্যাকটিক্স সহ আপনার সংস্করণ সর্বদা কাজ করবে না।
গিলস

0

আরও ভাল সমাধান আছে:

!!এক্সিকিউটড কমান্ডের পরে কেবল মুদ্রণ করুন এবং আপনি বারবার আউটপুট পাবেন।

যেমন

এখানে চিত্র বর্ণনা লিখুন

মূল:

https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash


!!শেষ কমান্ড থেকে ফলাফল পুনরাবৃত্তি না, এটি শেষ কমান্ড পুনরায় চালায়। যদি jot -r 1 0 10000 এবং 1000 এর মধ্যে একটি একক এলোমেলো সংখ্যা প্রদান করে, তবে একবার সেই আদেশটি চালানো এবং পাওয়ার পরে 539, চালানো !!সম্ভবত অন্য কিছু নম্বর দেবে। !!পূর্ববর্তী কমান্ডটি চালাতে উল্লেখযোগ্য সময় নেয়, বা এমন কোনও ক্রিয়াকলাপ পুনরাবৃত্তি করে যা পুনরায় করা উচিত নয় (ফাইল পরিবর্তন করার মতো)।
কালেব

1
চমৎকার ধরা. যদিও আমাকে ভুল প্রমাণ করার সহজ উপায় রয়েছে: প্রতিধ্বনি $ র্যান্ডম; !!
তেবে

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