พิจารณาสิ่งนี้:
$ 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:
$
ฉันทดสอบสิ่งนี้โดย sshing จากเครื่อง Ubuntu เครื่องหนึ่งไปยังเครื่องอื่น (ทั้งที่กำลังรันทุบตี 4.3.11) และบนเครื่อง Arch ให้ทำตามที่แสดงไว้ด้านบน (ทุบตีรุ่น 4.4.5)
เกิดอะไรขึ้นที่นี่? เหตุใดการส่งออกตัวแปรภายในการbash -c
โทรจึงสร้างเอาต์พุตนี้
export
ฉันพยายามที่จะเข้าใจว่าเกิดอะไรขึ้น ฉันจะแก้ไขเพื่อชี้แจงว่าสิ่งนี้จะเกิดขึ้นเฉพาะเมื่อส่งออกเท่านั้น
export
ทำงานคนเดียว ที่ฉันไม่เข้าใจ
foo=bar
ไม่ปรากฏในรายการ
export
แต่ผลลัพธ์คือผลของการทำงาน Zsh ทำสิ่งเดียวกัน