একটি নতুন ম্যাক ওএস এক্স টার্মিনাল উইন্ডোতে একটি কমান্ড চালানো


92

আমি একটি নতুন ম্যাক্স ওএস এক্স টার্মিনাল.এপ উইন্ডোতে কীভাবে ব্যাশ কমান্ড চালাতে পারি তা চেষ্টা করার চেষ্টা করছি। উদাহরণস্বরূপ, একটি নতুন বাশ প্রক্রিয়াতে আমি আমার কমান্ডটি কীভাবে চালিত করব তা এখানে:

bash -c "my command here"

তবে এটি একটি নতুন তৈরির পরিবর্তে বিদ্যমান টার্মিনাল উইন্ডোটিকে পুনরায় ব্যবহার করে। আমি এরকম কিছু চাই:

Terminal.app -c "my command here"

তবে অবশ্যই এটি কাজ করে না। আমি "ওপেন -a টার্মিনাল.এপ" কমান্ডটি সম্পর্কে সচেতন, তবে কীভাবে আর্গুমেন্টগুলি টার্মিনালে প্রেরণ করা যায় তা আমি দেখতে পাচ্ছি না, এমনকি আমি কী যুক্তি ব্যবহার করব তা বললেও।


আপনি সর্বদা পছন্দগুলি খুলতে পারতেন, "প্রোফাইলগুলি" ট্যাবে যান, "শেল" পৃষ্ঠাতে যান এবং সেখানে স্টার্টআপ কমান্ডটি সেট করতে পারেন। অ্যাপ্লিকেশনটি খোলার সময় এটি চালিত হয় তবে এটি হ্যাকি বিকল্পগুলির চেয়ে আরও ভাল কাজ করে!
জেন হেলটন

এছাড়াও সুপার-ইউজার একই প্রশ্ন দেখতে পাবেন superuser.com/q/174576/122841
পোকা

উত্তর:


96

আমার মাথার উপরের দিক থেকে এটি করার জন্য আমি ভাবতে পারি যে একটি উপায়। কম্যান্ড ফাইল তৈরি করা এবং এটি এ জাতীয়ভাবে চালানো:

echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command

বা অ্যাপ্লিক্রিপ্ট ব্যবহার করুন:

osascript -e 'tell application "Terminal" to do script "echo hello"'

যদিও আপনাকে হয় প্রচুর ডাবল উদ্ধৃতি থেকে বাঁচতে হবে অথবা একক উদ্ধৃতি ব্যবহার করতে সক্ষম হবেন না


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

4
যদি কমান্ডটি প্যারামিট্রাইজড চালানোর প্রয়োজন হয় তবে সম্ভবত আপনি একক এবং ডাবল উদ্ধৃতি স্যুপ করতে চান; যদিও এটি সঠিকভাবে করতে সক্ষম হওয়ার জন্য আপনাকে পার্থক্যটি বুঝতে হবে। osascript -e "tell application \"Terminal\" to do script \"echo '$variable'\"'
ট্রিপলি

টার্মিনাল উইন্ডোতে বোকামি বাম বন্ধ কিভাবে?
নিকোলাস ডিপিয়াজা

; exitশেল স্ক্রিপ্ট কমান্ডের শেষে যুক্ত করুন , পছন্দ করুন do script "echo hello; exit"। আপনার এখনও আলাদাভাবে উইন্ডোটি বন্ধ করতে হবে।
ট্রিপলি

65

আংশিক সমাধান:

আপনার পছন্দ মতো জিনিসগুলি শেল-স্ক্রিপ্টে রাখুন

#!/bin/bash
ls
echo "yey!"

এবং chmod +x fileএটি কার্যকর করার জন্য ' ' করতে ভুলবেন না । তারপর তুমি পারো

open -a Terminal.app scriptfile

এবং এটি একটি নতুন উইন্ডোতে চলবে। bashনতুন সেশনটি প্রস্থান করা থেকে বাঁচতে স্ক্রিপ্টের শেষে ' ' যুক্ত করুন । (যদিও আপনাকে ব্যবহারকারীদের আরসি-ফাইল এবং স্টাফগুলি কীভাবে লোড করতে হবে তা নির্ধারণ করতে হতে পারে ..)


7
সদ্য খোলা উইন্ডোটির প্রসঙ্গটি ব্যবহারকারীর মূল ফোল্ডার বলে মনে হচ্ছে /Users/{username}। কনটেক্সট ফোল্ডারটি প্যারেন্ট টার্মিনাল উইন্ডোটি খোলার মতো রাখার কি কোনও উপায় আছে?
জনি ওশিকা

> যদিও আপনাকে ব্যবহারকারীদের আরসি-ফাইল এবং স্টাফগুলি কীভাবে লোড করতে হবে তা নির্ধারণ করতে হতে পারে .. এর জন্য বাশ-এল ব্যবহার করুন
আইভার

35

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

#!/bin/sh 
osascript <<END 
tell application "Terminal"
    do script "cd \"`pwd`\";$1;exit"
end tell
END

গৃহীত স্ক্রিপ্টটিকে অপছন্দ করুন, আপনার বর্তমান ডিরেক্টরি সমস্যার সমাধান করুন। ধন্যবাদ!
মারবনি

দুর্দান্ত সমাধান; এটি লঞ্চ শেল এ tab 1 of window id 7433স্টাডাউট মত কিছু আউটপুট , যদিও। দমন করতে, আগে রাখুন>/dev/null <<END
mklement0

4
এটি সহজাতভাবে টার্মিনাল উইন্ডোটি বন্ধ করে না। এটি কমান্ড দোভাষী থেকে বেরিয়ে আসে। টার্মিনাল.এপটি উইন্ডোটি স্বয়ংক্রিয়ভাবে বন্ধ করতে বা কমান্ড ইন্টারপ্রেটারের পরিষ্কার প্রস্থানে কনফিগার করতে হবে।
ব্যবহারকারী 66001

8

কেউ যদি যত্ন করে তবে আইটার্মের সমতুল্য এখানে রয়েছে:

#!/bin/sh
osascript <<END
tell application "iTerm"
 tell the first terminal
  launch session "Default Session"
  tell the last session
   write text "cd \"`pwd`\";$1;exit"
  end tell
 end tell
end tell
END

3

এখানে আরও একবার এটি গ্রহণ করা হয়েছে (এছাড়াও অ্যাপলস্ক্রিপ্ট ব্যবহার করে):

function newincmd() { 
   declare args 
   # escape single & double quotes 
   args="${@//\'/\'}" 
   args="${args//\"/\\\"}" 
   printf "%s" "${args}" | /usr/bin/pbcopy 
   #printf "%q" "${args}" | /usr/bin/pbcopy 
   /usr/bin/open -a Terminal 
   /usr/bin/osascript -e 'tell application "Terminal" to do script with command "/usr/bin/clear; eval \"$(/usr/bin/pbpaste)\""' 
   return 0 
} 

newincmd ls 

newincmd echo "hello \" world" 
newincmd echo $'hello \' world' 

দেখুন: কোডনিপেটস.জয়য়েন্ট.কম / পোস্ট / শো / 1516


3

আমি অস্কারের উত্তরের একটি ফাংশন সংস্করণ তৈরি করেছি, এটি পরিবেশ এবং অনুলিপি যথাযথ ডিরেক্টরিতেও অনুলিপি করে

function new_window {
    TMP_FILE=$(mktemp "/tmp/command.XXXXXX")
    echo "#!/usr/bin/env bash" > $TMP_FILE

    # Copy over environment (including functions), but filter out readonly stuff
    set | grep -v "\(BASH_VERSINFO\|EUID\|PPID\|SHELLOPTS\|UID\)" >> $TMP_FILE

    # Copy over exported envrionment
    export -p >> $TMP_FILE

    # Change to directory
    echo "cd $(pwd)" >> $TMP_FILE

    # Copy over target command line
    echo "$@" >> $TMP_FILE

    chmod +x "$TMP_FILE"
    open -b com.apple.terminal "$TMP_FILE"

    sleep .1 # Wait for terminal to start
    rm "$TMP_FILE"
}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

new_window my command here

বা

new_window ssh example.com

4
TMP_FILE="tmp.command"আপনি একই সাথে একাধিক প্রক্রিয়া শুরু করলে লাইনটি সমস্যা হতে পারে। আমি এটিকে প্রতিস্থাপন করার পরামর্শ দেবTMP_FILE=$(mktemp "/tmp/command.XXXXXX")
দুথেন

2

এখানে আমার দুর্দান্ত স্ক্রিপ্টটি রয়েছে, এটি প্রয়োজনে একটি নতুন টার্মিনাল উইন্ডো তৈরি করে এবং ফাইন্ডার সামনে থাকলে ডিরেক্টরি ফাইন্ডারে স্যুইচ হয়। কমান্ড চালানোর জন্য আপনার প্রয়োজনীয় সমস্ত যন্ত্রপাতি রয়েছে।

on run
    -- Figure out if we want to do the cd (doIt)
    -- Figure out what the path is and quote it (myPath)
    try
        tell application "Finder" to set doIt to frontmost
        set myPath to finder_path()
        if myPath is equal to "" then
            set doIt to false
        else
            set myPath to quote_for_bash(myPath)
        end if
    on error
        set doIt to false
    end try

    -- Figure out if we need to open a window
    -- If Terminal was not running, one will be opened automatically
    tell application "System Events" to set isRunning to (exists process "Terminal")

    tell application "Terminal"
        -- Open a new window
        if isRunning then do script ""
        activate
        -- cd to the path
        if doIt then
            -- We need to delay, terminal ignores the second do script otherwise
            delay 0.3
            do script " cd " & myPath in front window
        end if
    end tell
end run

on finder_path()
    try
        tell application "Finder" to set the source_folder to (folder of the front window) as alias
        set thePath to (POSIX path of the source_folder as string)
    on error -- no open folder windows
        set thePath to ""
    end try

    return thePath
end finder_path

-- This simply quotes all occurrences of ' and puts the whole thing between 's
on quote_for_bash(theString)
    set oldDelims to AppleScript's text item delimiters
    set AppleScript's text item delimiters to "'"
    set the parsedList to every text item of theString
    set AppleScript's text item delimiters to "'\\''"
    set theString to the parsedList as string
    set AppleScript's text item delimiters to oldDelims
    return "'" & theString & "'"
end quote_for_bash

1

একজন সহকর্মী আমাকে জিজ্ঞাসা করলেন কীভাবে একবারে প্রচুর পরিমাণে ssh সেশন খুলবেন। আমি এই স্ক্রিপ্টটি লিখতে কোব্বলের উত্তর ব্যবহার করেছি:

tmpdir=$( mktemp -d )
trap '$DEBUG rm -rf $tmpdir ' EXIT
index=1

{
cat <<COMMANDS
ssh user1@host1
ssh user2@host2
COMMANDS
} | while read command
do 
  COMMAND_FILE=$tmpdir/$index.command
  index=$(( index + 1 ))
  echo $command > $COMMAND_FILE
  chmod +x  $COMMAND_FILE
  open $COMMAND_FILE
done
sleep 60

কমান্ডের তালিকা আপডেট করে (তাদের এসএস-ডেকে নেওয়া উচিত নয়), আপনি প্রতিটি কমান্ড কার্যকর করার জন্য একটি অতিরিক্ত ওপেন উইন্ডো পাবেন। sleep 60শেষে সেখানে রাখা .commandফাইল প্রায় যখন তারা মৃত্যুদন্ড কার্যকর করা হচ্ছে। অন্যথায়, শেলটি খুব দ্রুত সম্পূর্ণ হয়, লঞ্চ সেশনগুলির ফাইলগুলি পড়ার সুযোগ পাওয়ার আগে টেম্প ডিরেক্টরিটি (এমকেটেম্প দ্বারা নির্মিত) মুছতে ফাঁদ কার্যকর করে।


0

আপনি কী সংমিশ্রণটি টিপে টার্মিনালের নতুন কমান্ড বৈশিষ্ট্যটিও ডেকে আনতে পারেন Shift + ⌘ + N। আপনি যে কমান্ডটি বক্সে রেখেছেন তা একটি নতুন টার্মিনাল উইন্ডোতে চালিত হবে।


অবশ্যই জানতে দরকারী, তবে আমার এটি অগ্রগতিমূলকভাবে করা দরকার। আমার প্রোগ্রামটি একটি। কম্যান্ড ফাইল তৈরি করে এবং তারপরে এটি খোলার যুক্তিসঙ্গত (যদি কিছুটা হ্যাকিশ হয়) সমাধান।
ওয়াল্ট ডি

0

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

chmod +x ~/bin/trun

তারপরে আপনি তাদের সামনে কেবল ট্রুন যুক্ত করে একটি নতুন উইন্ডোতে কমান্ডগুলি চালাতে পারেন:

trun tail -f /var/log/system.log

এখানে স্ক্রিপ্ট। এটি আপনার আর্গুমেন্টগুলি পাস করা, শিরোনাম বার পরিবর্তন করা, শেল স্টার্টআপ বিশৃঙ্খলা অপসারণ করার জন্য পর্দা সাফ করা, কাজটি শেষ হয়ে গেলে তার ফাইলটি সরিয়ে ফেলার মতো কিছু অভিনব কাজ করে। প্রতিটি নতুন উইন্ডোর জন্য একটি অনন্য ফাইল ব্যবহার করে এটি একই সাথে অনেকগুলি উইন্ডো তৈরি করতে ব্যবহৃত হতে পারে।

#!/bin/bash
# make this file executable with chmod +x trun
# create a unique file in /tmp
trun_cmd=`mktemp`
# make it cd back to where we are now
echo "cd `pwd`" >$trun_cmd
# make the title bar contain the command being run
echo 'echo -n -e "\033]0;'$*'\007"' >>$trun_cmd
# clear window
echo clear >>$trun_cmd
# the shell command to execute
echo $* >>$trun_cmd
# make the command remove itself
echo rm $trun_cmd >>$trun_cmd
# make the file executable
chmod +x $trun_cmd

# open it in Terminal to run it in a new Terminal window
open -b com.apple.terminal $trun_cmd

4
$*সর্বত্রের ভুল ব্যবহার ইনপুটটিতে কোনও অনিয়ন্ত্রিত উদ্ধৃতি নষ্ট করে দেবে। "$@"পরিবর্তে আপনি চান ।
ট্রিপলি

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