কোনও এসএসএস শেলের মধ্যে একটি ভেরিয়েবল রফতানি কেন রফতানি ভেরিয়েবলের তালিকা মুদ্রণ করে?


17

এই বিবেচনা:

$ ssh localhost bash -c 'export foo=bar'
terdon@localhost's password: 
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x HOME="/home/terdon"
declare -x LOGNAME="terdon"
declare -x MAIL="/var/spool/mail/terdon"
declare -x OLDPWD
declare -x PATH="/usr/bin:/bin:/usr/sbin:/sbin"
declare -x PWD="/home/terdon"
declare -x SHELL="/bin/bash"
declare -x SHLVL="2"
declare -x SSH_CLIENT="::1 55858 22"
declare -x SSH_CONNECTION="::1 55858 ::1 22"
declare -x USER="terdon"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="c5"
declare -x _="/usr/bin/bash"

কেন bash -cসেশনের মধ্যে একটি চলক রফতানি করে ssh এর মাধ্যমে চালানো declare -xকমান্ডের তালিকার (বর্তমানে রফতানি হওয়া ভেরিয়েবলের তালিকা, যতদূর আমি বলতে পারি) ফলাফল তৈরি করে?

এটি না bash -cকরে একই জিনিস চালানো :

$ ssh localhost  'export foo=bar'
terdon@localhost's password: 
$

আমরা না করলে তাও হয় না export:

$ ssh localhost bash -c 'foo=bar'
terdon@localhost's password: 
$ 

আমি এটি একটি উবুন্টু মেশিন থেকে অন্যটিতে (উভয় চলমান বাশ ৪.৩.১১) এবং একটি আর্চ মেশিনে ছুঁড়ে দিয়ে পরীক্ষা করেছি, উপরের মত বর্ণিতভাবে নিজের দিকে ঝাঁকুনি দিয়েছি (বাশ সংস্করণ ৪.৪.৫)

এখানে কি হচ্ছে? bash -cকলটির অভ্যন্তরে কোনও পরিবর্তনশীল রফতানি করলে এই আউটপুটটি কেন উত্পাদিত হয়?


এটি প্রশ্নের উত্তর দেয় না, তবে আউটপুটটি চলমান ফলাফল export। Zsh একই জিনিস করে।
স্টিফেন কিট

@ স্টেফেনকিট হ্যাঁ, আমি জানি এটি export, আমি কী ঘটছে তা বোঝার চেষ্টা করছি। আমি পরিষ্কার করতে সম্পাদনা করব যে রফতানির সময় কেবল এটি ঘটে।
টেরডন

আহ ঠিক আছে, আমি "বর্তমানে রফতানি ভেরিয়েবলের তালিকাটি পড়েছি, যতদূর আমি বলতে পারি" এর অর্থ হ'ল আউটপুটটি কোথা থেকে আসছে তা আপনি জানেন না।
স্টিফেন কিট

@ স্টেফেনকিট বলতে চাইছি আমি নিশ্চিত নই যে প্রতিটা রফতানি চলক বা একটি নির্দিষ্ট উপসেট বা কি। উহু! আপনি বলতে চাচ্ছেন যে এটি exportএকা চালানোর আউটপুট ? আমি বুঝতে পারি নি যে।
টেরডন

নোট যে foo=barতালিকায় প্রদর্শিত হবে না।
ডেল্টব

উত্তর:


31

আপনি যখন কোনও কমান্ড চালান ssh, তখন এটি পতাকা $SHELLসহ আপনার ডাক দিয়ে চালিত হয় -c:

-c    If the -c option is present, then commands are read from 
      the first non-option argument command_string.  If there  are
      arguments  after the command_string, the first argument is 
      assigned to $0 and any remaining arguments are assigned to
      the positional parameters.  

সুতরাং, ssh remote_host "bash -c foo"আসলে চালানো হবে:

/bin/your_shell -c 'bash -c foo'

এখন, আপনি যে কমান্ডটি চালাচ্ছেন ( export foo=bar) তাতে স্পেস রয়েছে এবং পুরোটি গঠনের জন্য যথাযথভাবে উদ্ধৃতি দেওয়া হয়নি, এটি exportচালানোর জন্য কমান্ড হিসাবে নেওয়া হবে এবং বাকিগুলি অবস্থানগত পরামিতি অ্যারেতে সংরক্ষণ করা হবে। এর অর্থ এটি exportচালিত এবং foo=barএটি হিসাবে পাস করা হয় $0। চূড়ান্ত ফলাফল চলমান হিসাবে একই

/bin/your_shell -c 'bash -c export'

সঠিক আদেশটি হ'ল:

ssh remote_host "bash -c 'export foo=bar'"

9

ssh স্পেস দিয়ে আর্গুমেন্টগুলি সম্মত করে এবং দূরবর্তী ব্যবহারকারীর লগইন শেলটি এটি ব্যাখ্যা করে, তাই এতে:

ssh localhost bash -c 'export foo=bar'

ssh দূরবর্তী শেলটি এর ব্যাখ্যা করতে বলছে

bash -c export foo=bar

কমান্ড (কার্যকরী, যদি দূরবর্তী হোস্ট হয় ইউনিক্সের মত তার সাথে দূরবর্তী শেল চালানো হবে the-shell, -cএবং bash -c export foo=barআর্গুমেন্ট হিসাবে)।

সর্বাধিক শাঁস চলমান হিসাবে যে কমান্ড লাইন কী ব্যাখ্যা দেবেন bashসঙ্গে কমান্ড bash, -c, exportএবং foo=barআর্গুমেন্ট হিসাবে (তাই চালানোর exportসময় $0রয়েছে foo=bar) আপনি এটি দিয়ে এটি চালানোর জন্য চাই চাই যখন bash, -cএবং export foo=barআর্গুমেন্ট হিসাবে।

তার জন্য আপনার একটি কমান্ড লাইন ব্যবহার করা দরকার:

ssh localhost "bash -c 'export foo=bar'"

(অথবা:

ssh localhost bash -c \'export foo=bar\'

যে বিষয়গুলির জন্য) তাই:

bash -c 'export foo=bar'

কমান্ড লাইনটি দূরবর্তী শেলকে দেওয়া হবে। যে কমান্ড লাইন চলমান হিসাবে সবচেয়ে শাঁস ব্যাখ্যা করা হবে bashসঙ্গে কমান্ড bash, -cএবং export foo=barআর্গুমেন্ট হিসাবে। নোট করুন যে ব্যবহার

ssh localhost 'bash -c "export foo=bar"'

দূরবর্তী ব্যবহারকারীর লগইন শেল rcবা esউদাহরণস্বরূপ যেখানে "কোনও বিশেষ উদ্ধৃতি অপারেটর না থাকলে এটি কাজ করবে না । একক উদ্ধৃতি হ'ল সর্বাধিক বহনযোগ্য উদ্ধৃতি অপারেটরগুলি (যদিও শাঁসের মধ্যে তাদের ব্যাখ্যা করা যায় সে সম্পর্কে কিছুটা পার্থক্য রয়েছে, দূরবর্তী ব্যবহারকারীর লগইন শেল না জেনে ssh এর উপর একটি স্বেচ্ছাসেবী সাধারণ কমান্ড কীভাবে কার্যকর করা যায় দেখুন ? তার আরও তথ্যের জন্য)।

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