সোর্স ব্লকের জট বাঁধার সময় কি STDIN থেকে ব্যবহারকারীর ইনপুট পড়া সম্ভব?


10

সোর্স ব্লকের সাথে জট বেঁধে যখন STDIN থেকে ব্যবহারকারীর ইনপুট পড়া সম্ভব org-babel-tangle?

আমি এটি সম্পর্কে সচেতন: অর্গ মোড ব্যাবেল - ইন্টারেক্টিভ কোড ব্লক মূল্যায়ন

এটি এই নির্দিষ্ট ব্যবহার-কেস সমাধান করতে সহায়তা করে না, কারণ এটি এখনও শেল থেকে উপযুক্ত এসটিডিন ইনপুট অনুমোদন করে না, তবে কেবল ইমাসে অভ্যন্তরীণভাবে একটি সীমিত ইনপুট অনুকরণ করে ।

পটভূমি

আমি একটি org ফাইল থেকে কিছু টিউটোরিয়াল চালিয়ে নতুন প্রোগ্রামিং ভাষা (পার্ল এবং বাশ) শিখতে org এর বাবেলটি ব্যবহার করতে চাই।

সমস্যাটি হ'ল অনেক টিউটোরিয়াল STDIN এর উপর নির্ভর করে। উদাহরণস্বরূপ, যদি কেউ নিম্নলিখিত পার্ল টিডবিট চালায়:

#+BEGIN_SRC perl :tangle hello-name.pl  :results output :export code
use 5.010;
use strict;
use warnings;

say "What is your name?";
my $name=<STDIN>;
say "Hello $name, how are you?";

#+END_SRC

ইমাস্যাকগুলি STDIN- তে সঠিকভাবে কোনও নাম লিখতে ব্যবহারকারীর ইন্টারঅ্যাকশনটির জন্য অপেক্ষা করবে না , এবং এটি অবিলম্বে আউটপুট তৈরি করবে:

#+RESULTS:
: What is your name?
: Hello , how are you?

বাশ উদাহরণ ব্যবহার করে একই জিনিস। এই:

#+BEGIN_SRC sh  :results output :export code :tangle dir-input.sh
#!/bin/bash

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
fi
#+END_SRC

ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করবে না এবং ইমাকগুলি অবিলম্বে এটি ফিরিয়ে দেবে:

#+RESULTS:
: TEST_DIR was not set, please enter the path: 

ইমাক্সের কোনও নির্বাহী জড়িত ব্লকে ইনপুটটির জন্য অপেক্ষা করার কোনও দেশীয় উপায় আছে?

যদি তা না হয় তবে দয়া করে কীভাবে কোনও tangle-and-run-via-shell-bufferফাংশনের মতো কিছু লিখতে হবে তার জন্য কিছু পয়েন্টার দেবেন:

  • কোড ব্লকটি বিন্দুতে সংযুক্ত করুন, প্রদত্ত ফাইলের নাম সহ সংরক্ষণ করুন,
  • একটি দৃশ্যমান shellবাফারে সংশ্লিষ্ট ফাইলটি চালান ,
  • সম্ভবত ব্যবহারকারীর কাছ থেকে ইনপুট গ্রহণ করা,
  • এবং শেষ পর্যন্ত রিপোর্টিং STDOUT, যদি কোন হয় #+RESULTS:?

এই জাতীয় বৈশিষ্ট্যটি যদি অর্গে (এখনও) প্রয়োগ না করা হয়, তবে কীভাবে কেউ এলিসপ দিয়ে এটি প্রয়োগ করতে পারে?


আপডেট: আরও ইমাস এবং এলিসপ ম্যানুয়ালগুলি অনুসন্ধান এবং অধ্যয়নের পরে, মনে হচ্ছে এটি করার উপায়টি কমেন্টের পক্ষে উপার্জন করবে , সম্ভবত make-comint-in-buffer

(make-comint-in-buffer "*cmd-buffer*" nil "perl" nil "hello-name.pl")

দুর্ভাগ্যক্রমে, এখনই এটি আমার মাথার উপরে 😣

উত্তর:


4

এটা চেষ্টা কর

দ্রষ্টব্য : আপনার কোড ব্লকে নিম্নলিখিত পরিবর্তনগুলি করা হয়েছে:

  • #!/bin/bashব্লকটি :shebang #!/bin/bashযখন জড়িয়ে থাকে তখন স্বয়ংক্রিয়ভাবে এক্সিকিউটেবল ফাইল অনুমতি সেট করতে কোড ব্লক শিরোনামে সরানো হয় dir-input.sh

  • যুক্ত করার জন্য যুক্ত করা ডিবাগ কোড $TEST_DIRথেকে সঠিকভাবে নির্ধারিত হয়েছিল read input_variable

#+BEGIN_SRC sh  :results output :export code :tangle dir-input.sh :shebang #!/bin/bash

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
    echo "# export TEST_DIR=$TEST_DIR"
fi
#+END_SRC   

তারপর জটলা ফাইল কল করতে নতুন কোড ব্লক তৈরি ./dir-input.sh

#+BEGIN_SRC sh :results output :shebang #!/bin/bash  :var USER_INPUT=(read-string "Test Dir: ")
  echo $USER_INPUT | ./dir-input.sh 
#+END_SRC

লক্ষ্য শিরোনাম :var USER_INPUT=(read-string "Test Dir: ")

এই শিরোনামটি উইন্ডোতে একটি Test Dir:প্রম্পট প্রদর্শন করবে minibufferযখন কোড ব্লকটি ব্যবহার করে কার্যকর করা হয় C-c C-c

পাথটি প্রবেশ করান, যেমন / পথ / থেকে / পরীক্ষা / দির enter

এবং ব্লকটি ./dir-input.shমাধ্যমে ইনপুটটি পাস করবে STDIN। আপনি নিম্নলিখিত দেখতে হবে#+RESULTS:

#+RESULTS:
: TEST_DIR was not set, please enter the path: 
: # export TEST_DIR=/path/to/test/dir

আশা করি যে সাহায্য!


কোডটি এর সাথে পরীক্ষিত:
জিএনইউ ইমাকস 24.4.1 (x86_64-আপেল-ডারউইন 14.0.0, এনএস অ্যাপেল-অ্যাপকিট -1343.14) 2014-12-25 এর org-
মোড সংস্করণ: 8.3.2


এটি বেশ কিছুটা সাহায্য করে, আপনাকে ধন্যবাদ। ভার্স ব্যবহারের একটি সৃজনশীল উপায়, খুব শিক্ষামূলক। আমি ভাবছি যে আমি কীভাবে STDIN "সম্পূর্ণ" ক্যাপচার করতে যাব, বাছাইয়ের ধরণ, যেমন দেশী শেল থেকে একজন যেমন পারে? উদাহরণস্বরূপ, নতুন লাইনগুলি এবং নিয়ন্ত্রণ চরগুলি পড়তে সক্ষম হতে (সিটিআরএল-ডি এর পাশে)?
gsl

1
@gsl - বিটিডাব্লু - আমি এখনও একাধিক লাইন এবং নিয়ন্ত্রণের অক্ষর সম্পর্কে প্রশ্নের নতুন উত্তর নিয়ে কাজ করছি। যদি আমি এটির আগে বুঝতে পারি তবে দয়া করে আপনার উত্তর পোস্ট করুন।
মেলিওরাটাস

একটি নতুন উত্তর প্রস্তুত করার জন্য আপনাকে অনেক ধন্যবাদ। আমি এখনও একটি কাজের সমাধান খুঁজছি। আমি নিজেই এটি অনুমান করতে পারি না, এখনই আমার মাথার উপরে। আমি আপনার উত্তরটি বেছে নিচ্ছি, এবং যখন আপনার নতুন একটি উপস্থিত হবে, পরে এটি নির্বাচন করুন।
জিএসএল

হাই @ মেলিওরাটাস - আপনি একাধিক লাইন এবং নিয়ন্ত্রণের অক্ষরগুলির সাথে ডিল করার কোনও উপায় খুঁজে পেতে পেরেছিলেন? এটি অনেক ক্ষেত্রে বেশ কার্যকর হবে।
জিএসএল

1
@gsl - অনুসরণ করার জন্য ধন্যবাদ! আপনি স্টিডিন থেকে সঠিক পড়া সত্যিই দরকারী হবে এবং আমি এখনও খুঁজছি! আমি কমান্ড লাইন থেকে নামকরণের বাফারে স্টিডিন পড়ার অগ্রগতি করেছি এবং তারপরে ভেরিয়েবলে মাল্টলাইন বাফার পড়তে এলিসপকে কল করেছি। পাইপ থেকে পড়ার সময় এটি কাজ করে তবে দুর্ভাগ্যক্রমে স্ট্রিন স্ট্রিমিংয়ের জন্য এখনও নয়, tail file |কাজ করে তবে তা নয় tail -f file |। আমি আমার নোটগুলি সন্ধান করব এবং আংশিকভাবে কাজ করা মাল্টলাইন উদাহরণটিকে নতুন উত্তর হিসাবে যুক্ত করব। স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ!
মেলিওরাটাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.