বাশ স্ক্রিপ্টে দুটি সিডি কমান্ড ব্যবহার করে দ্বিতীয় কমান্ড কার্যকর করা হয় না কেন?


15

আমি একটি বাশ স্ক্রিপ্ট লিখেছি যা একটি সিরিজ ডিরেক্টরি তৈরি করে এবং নির্বাচিত ডিরেক্টরিতে একটি প্রকল্প ক্লোন করে।

তার জন্য, আমার cdপ্রতিটি ডিরেক্টরিতে ( project 1এবং project 2) দরকার, তবে স্ক্রিপ্টটি cdদ্বিতীয় ডিরেক্টরিতে যায় না এবং কমান্ডটি কার্যকর করে না।

পরিবর্তে, এটি পরে বন্ধ হয় cdএবং project2ডিরেক্টরিতে ক্লোনিং । এটি কেন নীচের cd_project1কোডটিতে ফাংশনটি কল করে না ?

#!/bin/bash
#Get the current user name 

function my_user_name() {        
current_user=$USER
echo " Current user is $current_user"
}

#Creating useful directories

function create_useful_directories() {  
  if [[ ! -d "$scratch" ]]; then
  echo "creating relevant directory"
  mkdir -p /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2
  else
     echo "scratch directory already exists"
     :
  fi
}

#Going to project2 and cloning 

function cd_project2() {

  cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2 &&
  git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
  exec bash
}

#Going to project1 directory and cloning 
function cd_project1() {

  cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/ &&
  git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
  exec bash

}

#Running the functions  
function main() {

  my_user_name
  create_useful_directories
  cd_project2
  cd_project1    
}
main

টার্মিনাল আউটপুট:

~/Downloads$. ./bash_install_script.sh    
Current user is mihi
creating relevant directory
Cloning into 'documentation-tests'...
remote: Counting objects: 125, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 125 (delta 59), reused 0 (delta 0)
Receiving objects: 100% (125/125), 33.61 KiB | 362.00 KiB/s, done.
Resolving deltas: 100% (59/59), done.
~/Downloads/scratch/mihi/project1/project2$

3
একটি উত্তর গ্রহণ বিবেচনা করুন। যদি একাধিক উত্তর কোনও প্রশ্নের সমাধান হয় - সেরাটি গ্রহণ করুন এবং অন্যকে ভোট দিন।
লিওনিডমিউ

1
হাই লিওনিডমিউ দুঃখিত, উত্তরগুলি কীভাবে গ্রহণ করবেন সে সম্পর্কে আমার কোনও ধারণা নেই। উভয় উত্তর যদিও সমান ভাল।
জেনি

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

2
@ লিওনিডমিও প্রশ্নটি জিজ্ঞাসা করার পরে সবে 45 মিনিট হয়ে গেছে, অপেক্ষা করা আর-ঠিক আছে, এর চেয়ে আরও ভাল উত্তর আসতে পারে (পার্লডাকের মন্তব্য অনুযায়ী, এটি টাইপ করার সময় ঠিক পপ আপ হয়েছিল)
জেন 2050

6
আপনি যা করতে চেয়েছিলেন তা আমি আগ্রহী exec bash
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


28

অপরাধীরা হ'ল আপনার exec bashকয়েকটি কার্যক্রমে আপনার বক্তব্য। execবিবৃতি একটু অদ্ভুত এবং সহজে প্রথম স্থানে বোঝা নয়। এর মানে: নিম্নলিখিত কমান্ড প্রয়োগ পরিবর্তে বর্তমানে চলমান কমান্ড / শেল / স্ক্রিপ্ট এখানে থেকে । এটি: এটি বর্তমান শেল স্ক্রিপ্ট (আপনার ক্ষেত্রে) এর উদাহরণ সহ প্রতিস্থাপন করে bashএবং এটি কখনই ফিরে আসে না।

আপনি এটি শেল এবং ইস্যু দিয়ে চেষ্টা করে দেখতে পারেন

exec sleep 5

এটি আপনার বর্তমান শেলটি (ক bash) কমান্ডের সাথে প্রতিস্থাপন করবে sleep 5 এবং যখন সেই আদেশটি ফিরে আসবে (5 সেকেন্ডের পরে) আপনার উইন্ডোটি বন্ধ হবে কারণ শেলটি প্রতিস্থাপন করা হয়েছে sleep 5

আপনার স্ক্রিপ্টের সাথে একই: আপনি যদি exec somethingআপনার স্ক্রিপ্টটিতে রাখেন তবে স্ক্রিপ্টটি প্রতিস্থাপন হয়ে যায় somethingএবং যখন এটি somethingকার্যকর করা বন্ধ হয়, পুরো স্ক্রিপ্টটি বন্ধ হয়ে যায়।

কেবল exec bashবিবৃতিগুলি বাদ দেওয়া উচিত।


2
@ জেনি শুনে ভাল লাগল। গপ্প: দ্য পার্ল ভাষা এছাড়াও একটি হয়েছে execএকই আচরণ সঙ্গে বিবৃতি এবং যদি আপনি কিছু বিবৃতি করা পর একটি execবিবৃতি (মত exec something; print "This won't run";) তাহলে পার্ল আপনাকে সতর্ক করবে printবিবৃতি মৃত্যুদন্ড কার্যকর হবে না।
পার্লডাক

9
বিটিডাব্লু সিডির পরে && ব্যবহারে সম্মতি জানায়, (যদি আপনি ব্যবহার না করেন set -e)। আমি cd tmp; rm -rf *
কোডটি

15

থেকে help exec:

exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

এখানে মূল শব্দটি প্রতিস্থাপন করা হয়েছে - আপনি যদি exec bashকোনও স্ক্রিপ্টের ভিতরে থেকে থাকেন তবে আর কোনও স্ক্রিপ্টের সম্পাদনা ঘটতে পারে না।


0

আপনি যে ডিরেক্টরিটিতে ব্যবহার শুরু করেছিলেন তা ফিরে পেতে চাইলে

cd -

তবে আপনি যদি নিশ্চিত না হন যে কোনও cdকমান্ড নির্বাহ করা হয়েছে কি না তবে কার্যকরী ডিরেক্টরিগুলি স্ট্যাকের উপরে রাখার জন্য আদেশগুলি ব্যবহার করা ভাল:

pushd

এবং এটিতে ফিরে (একাধিক ডিরেক্টরি পরিবর্তনের পরেও)

popd

সমতা pushdএবং popdকমান্ড আছে তা নিশ্চিত হন ।


2
আমি নিশ্চিত যে আপনি সমস্যার স্থানটি পড়েছেন বা বুঝতে পেরেছেন। এই আদেশগুলির কোনওটিই ব্যবহারকারীকে সহায়তা করবে না।
পাইপ

আমি কোথাও শেলের মধ্যে কিছু কমান্ড কার্যকর করার প্রয়োজনীয়তা পড়তে পারি না। সুতরাং আমি ভেবেছিলাম তিনি শুরু নির্দেশে ফিরে আসতে ব্যাশকে ডাকলেন। যদি আপনি জেদ করেন তবে আপনি বলতে পারেন: তিনি অনুপস্থিত ধারাবাহিকতার কারণ জিজ্ঞাসা করেছিলেন, যা অন্য উত্তরগুলির দ্বারা পুরোপুরি উত্তর দেওয়া হয়েছে।
বার্ড উইল্কে πφ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.