এক লাইনে একাধিক লিনাক্স কমান্ড একত্রিত করুন


329

আমি মোতায়েনের কাজটি সম্পাদন করতে একাধিক লিনাক্স কমান্ড এক লাইনে মার্জ করার চেষ্টা করছি। উদাহরণ স্বরূপ

cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

উত্তর:


717

যদি আপনি প্রতিটি কমান্ড কেবলমাত্র যদি পূর্ববর্তীটি সফল হয় তবে কার্যকর করতে চান, তবে &&অপারেটরটি ব্যবহার করে তাদের একত্র করুন :

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

যদি কমান্ডগুলির মধ্যে একটি ব্যর্থ হয়, তবে এটি অনুসরণ করে অন্য সমস্ত কমান্ড কার্যকর করা হবে না।

পূর্ববর্তীগুলি ব্যর্থ হয়েছে কিনা তা নির্বিশেষে আপনি যদি সমস্ত কমান্ড কার্যকর করতে চান তবে সেমিকোলনগুলি দিয়ে তাদের আলাদা করুন:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

আপনার ক্ষেত্রে, আমি মনে করি আপনি প্রথম মামলাটি চান যেখানে পরবর্তী কমান্ড কার্যকর করা পূর্ববর্তী সাফল্যের উপর নির্ভর করে।

আপনি কোনও স্ক্রিপ্টে সমস্ত কমান্ডও রাখতে পারেন এবং পরিবর্তে এটি কার্যকর করতে পারেন:

#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install

(লাইনের শেষে ব্যাকস্ল্যাশগুলি শেলটি এই ভাবনা থেকে রক্ষা করতে পারে যে পরের লাইনটি একটি নতুন কমান্ড;

এটি একটি ফাইলে সংরক্ষণ করুন, উদাহরণস্বরূপ myscript, এবং এটি সম্পাদনযোগ্য করুন:

chmod +x myscript

আপনি এখন মেশিনে অন্যান্য প্রোগ্রামের মতো স্ক্রিপ্টটি কার্যকর করতে পারেন। তবে যদি আপনি এটিকে আপনার PATHপরিবেশের পরিবর্তনশীল (উদাহরণস্বরূপ /usr/local/bin, বা কিছু লিনাক্স বিতরণে ~/bin) তালিকাভুক্ত ডিরেক্টরিতে স্থাপন না করেন তবে আপনাকে সেই স্ক্রিপ্টের পথ নির্দিষ্ট করতে হবে specify এটি যদি বর্তমান ডিরেক্টরিতে থাকে তবে আপনি এটি দিয়ে এটি সম্পাদন করুন:

./myscript

স্ক্রিপ্টের কমান্ডগুলি প্রথম উদাহরণের কমান্ডগুলির মতোই কাজ করে; পূর্ববর্তী কমান্ড কেবলমাত্র কার্যকর হয় যদি পূর্ববর্তীটি সফল হয়। সমস্ত কমান্ডের নিঃশর্ত কার্যকর করার জন্য, প্রতিটি কমান্ডকে তার নিজস্ব লাইনে কেবল তালিকাবদ্ধ করুন:

#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install

38
ভবিষ্যতের পাঠকদের জন্য: আপনি ||সেমিকোলনের পরিবর্তেও ব্যবহার করতে পারেন বা &&আপনি যদি চান যে শেষ কমান্ডটি ব্যর্থ হয় তবে পরবর্তী কমান্ডটি কার্যকর করা হয়। যেমন এটি চেষ্টা করে দেখুন, এবং যদি এটি ব্যর্থ হয় তবে চেষ্টা করুন।
ডিভ্যাডার

3
এইচএম, সেমিকোলন সবসময় কাজ করে না। যেমন ls >/dev/null & ; echo $!একটি ত্রুটি ট্রিগার করে।
হাই-অ্যাঞ্জেল

1
এবং যদি আমি পটভূমিতে প্রথম কমান্ড চালাতে চাই এবং অন্যটি অগ্রভাগে অন্য .. আমি এটি চেষ্টা করছি tail -f my.log & && ./myscriptযা কাজ করছে না .. দয়া করে পরামর্শ দিন।
ওভাররকস্টার

4
@ পরেশকুমার বাশ সহ, আপনি এটি করতে পারেন: { tail -f my.log & } && ./myscriptতবে মনে রাখবেন যে এখানে &&কাজটি নিরর্থক, যেহেতু প্রথম কাজটি পটভূমিতে চলে এবং সুতরাং দ্বিতীয় কাজ ফলাফল জানতে পারে না, যেহেতু উভয় কাজ একই সাথে শুরু হবে। সুতরাং আপনি পাশাপাশি কেবল লিখতে পারেন:{ tail -f my.log & }; ./myscript
নিকস সি

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

46

আমি খুঁজে পেয়েছি যে ব্যবহার করে; পৃথক কমান্ড কেবল অগ্রভাগে কাজ করে। যেমন:

cmd1; cmd2; cmd3 & - শুধুমাত্র cmd3পটভূমিতে কার্যকর করা হবে , যেখানে cmd1 && cmd2 && cmd3 &- কোনও ত্রুটি না থাকলে ব্যাকগ্রাউন্ডে পুরো শৃঙ্খলা কার্যকর করবে।

নিঃশর্ত কার্যকর করার জন্য, প্রথম বন্ধনী ব্যবহার করে এটি সমাধান করে:

(cmd1; cmd2; cmd3) & - কোনও পদক্ষেপ ব্যর্থ হলেও পটভূমিতে শৃঙ্খলাবদ্ধ কমান্ডগুলি কার্যকর করবে।


1
আপনার উদাহরণগুলিতে অনুবর্তনকারী এম্পারস্যান্ড (&) ইচ্ছাকৃত ছিল? যদি তাই হয় তবে এটি কিসের জন্য?
টেকনোফিল


1
একটি সহজ, সংক্ষিপ্ত এবং সরাসরি উত্তর, আপনার স্ট্যাক এক্সচেঞ্জ ওয়েবসাইটগুলি প্রায়শই ডিন ব্যবহার করা উচিত। আপনার ইনপুট জন্য ধন্যবাদ।
সিপিএইচপিথন

10

আপনি একটি আধা কোলন ব্যবহার করে আপনার আদেশগুলি পৃথক করতে পারেন:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install

তুমি কি বোঝাতে চেয়েছ?


3

এগুলি একবারে চালাতে, আপনি পাইপ লাইনের কী "" "ব্যবহার করতে পারেন তাই ভালো:

$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install

1
পাইপলাইনটি আপনার কমান্ডের আউটপুট পরবর্তী কমান্ডকে একটি ইনপুট হিসাবে দেওয়ার জন্য ব্যবহৃত হচ্ছে। যেমন: এক্স | Y -> এক্স কমান্ড আউটপুট ওয়াই কমান্ডের ইনপুট হিসাবে কাজ করবে
অর্পণ সায়নী

2

যদি আপনি সমস্ত কমান্ড প্রয়োগ করতে চান, পূর্ববর্তীটি কার্যকর হয় বা না, আপনি কমান্ডগুলি পৃথক করতে সেমিকোলন (;) ব্যবহার করতে পারেন।

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

আপনি যদি পূর্ববর্তী কমান্ডটি সফল হয় তবেই পরবর্তী কমান্ডটি কার্যকর করতে চান তবে আপনি কমান্ডগুলি পৃথক করতে && ব্যবহার করতে পারেন।

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

আপনার ক্ষেত্রে, ধারাবাহিক কমান্ডগুলির সম্পাদনটি পূর্ববর্তী কমান্ডগুলির উপর নির্ভর করে বলে মনে হয়, সুতরাং দ্বিতীয় উদাহরণটি ব্যবহার করুন & কমান্ডগুলিতে যোগ দিতে && ব্যবহার করুন।


1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

এটি ওপি স্ক্রিপ্টের মতো নয়, দয়া করে ব্যাখ্যা করুন: যদি

4
অতিরিক্ত হিসাবে, আপনি cmd1 || cmd2যদি শেল-তে শূন্য-বিহীন স্থিতি ফিরে আসে cmd2তবেই কেবলমাত্র কার্যকর করতে হবে cmd1এবং আপনি cmd1 ; cmd2যদি উভয় কমান্ড তাদের রিটার্নের অবস্থা নির্বিশেষে চালাতে চান তবে আপনি বিভাজক ব্যবহার করতে পারেন ।
ভিক্টর সোরোকিন 21

@ স্পটনিক এটি হওয়া উচিত, আমি কেবল এটি আটকে দিয়েছি এবং &&
মার্ক স্টিভেন্সকে

3
@ মার্কস্টেভেনস এটি আরও কার্যকর বাস্তবায়ন কিন্তু কমান্ডগুলি ধারাবাহিকভাবে চালিত হওয়ার মতো একই ফলাফল পাবে না, আমি মনে করি স্পুটনিক এর অর্থ কি?
andrux

1

একমাত্র একটি এম্পারস্যান্ডের ইউটিলিটি কী? আজ সকালে, আমি একই সাথে 2 টি পাসওয়ার্ড পরিচালককে চালু করতে এক্সএফসিই প্যানেলে (মাঞ্জারো + এক্সএফসিইতে) একটি লঞ্চার তৈরি করেছি:

sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"

তবে আমি যেমন চাই তেমন কাজ করে না। IE, প্রথম অ্যাপ্লিকেশন শুরু হয় তবে দ্বিতীয়টি কেবল তখনই বন্ধ হয় যখন পূর্ববর্তীটি বন্ধ থাকে

তবে, আমি এটি দেখতে পেয়েছি (কেবলমাত্র একটি অ্যাম্পারস্যান্ড সহ):

sh -c "keepassx & password-gorilla"

এবং এটি এখন যেমন চাই তেমন কাজ করে ...


1
;আম্পারস্যান্ড কমান্ড টার্মিনেটর হিসাবে অনুরূপ কাজ করে , ব্যাকগ্রাউন্ডে কমমান রাখার আগে এটি শেল এর আউটপুট দেখতে পাবে না।
সের্গেই কোলোডিয়াজনি

আমার জন্য কাজ করে, thx।
দাস্কি স্টিটি

-1

আপনি নিম্নলিখিত কোড হিসাবে ব্যবহার করতে পারেন;

cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install

এটি কাজ করে ...


-1

এই ধরণের প্রশ্নের বিভ্রান্তিকর জন্য আমি প্রচুর উত্তর পেয়েছি

এই পোস্ট থেকে পরিবর্তিত: https://www.webmasterworld.com/linux/3613813.htm

নিম্নলিখিত কোডটি ব্যাশ উইন্ডো তৈরি করবে এবং ব্যাশ উইন্ডো হিসাবে ঠিক কাজ করবে। আশাকরি এটা সাহায্য করবে. অনেকগুলি ভুল / কাজ না করার উত্তর রয়েছে out

            Process proc;
            try {
                //create a bash window
                proc = Runtime.getRuntime().exec("/bin/bash");
                if (proc != null) {
                       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                       BufferedReader err = new BufferedReader(new InputStreamReader(
                       proc.getErrorStream()));
                       //input into the bash window
                       out.println("cd /my_folder");
                       out.println("rm *.jar");
                       out.println("svn co path to repo");
                       out.println("mvn compile package install");
                       out.println("exit");
                       String line;
                        System.out.println("----printing output-----");
                          while ((line = in.readLine()) != null) {
                             System.out.println(line);
                          }
                          while((line = err.readLine()) != null) {
                             //read errors
                          }
                          proc.waitFor();
                          in.close();
                          out.close();
                          err.close();
                          proc.destroy();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.