วิธีเพิ่มฟังก์ชั่นไปยัง. bash_profile / .profile / bashrc ในเชลล์?


24

ฉันมีฟังก์ชั่นที่แปลงเวลาของยุคปัจจุบัน นี่คือคำจำกัดความ

date1(){
  date -d @$1
}

ฉันต้องการเขียน:

$ date1 xxxyyy

โดยที่ xxxyyy เป็นพารามิเตอร์ที่ฉันส่งผ่านเข้าไปในฟังก์ชั่นของฉันดังนั้นฉันจะได้รับวันที่ที่สอดคล้องกัน ฉันเข้าใจว่าฉันต้องเพิ่มทั้งใน.bash_profile, .profileหรือ.bashrcแล้วแหล่งที่มาของมัน

$ source file

แต่ฉันไม่แน่ใจว่าจะใส่ไฟล์ไหนในปัจจุบันฉันมี.profileแล้ว แต่เพื่อให้ทำงานได้ฉันต้องทำsource .profileทุกครั้ง

เป็นการดีที่ควรทำให้พร้อมใช้งานเมื่อคอมพิวเตอร์เริ่มทำงานเหมือนตัวแปรสภาพแวดล้อม


สำหรับตัวอย่างอินพุต 1. เอาท์พุทข้อความ epochconverter.comตอนนี้คือ 1514917788; 2. จากการทุบตีตัวเอง $ date +% s ต่อstackoverflow.com/questions/1092631/…
AnneTheAgile

คำตอบ:


25

จากman bash:

เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์ที่ไม่มีการโต้ตอบกับตัวเลือก --login มันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่ หลังจากอ่านไฟล์นั้นจะค้นหา ~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับและอ่านและเรียกใช้คำสั่งจากไฟล์แรกที่มีอยู่และอ่านได้

ในคำอื่น ๆ ที่คุณสามารถวางไว้ในหนึ่งใด ๆ~/.bash_profile, ~/.bash_loginหรือ~/.profile, หรือไฟล์ใด ๆsourceวันโดยทั้งของคนเหล่านั้น โดยทั่วไปแล้ว~/.profileแหล่งที่มา~/.bashrcซึ่งเป็น "ไฟล์การเริ่มต้นส่วนบุคคลจะถูกเรียกใช้งานสำหรับเปลือกเข้าสู่ระบบ"

ต้องการเปิดใช้งานมันได้ทั้งเปลือกเริ่มต้นใหม่วิ่งหรือวิ่งexec $SHELLsource ~/.bashrc


1
ดีฉันพยายามที่วิธีการของคุณสำหรับการสร้างฟังก์ชั่นที่กำหนดเองการพิมพ์ก็โต้แย้ง แต่แม้ว่าฉันจะเพิ่มฟังก์ชั่นว่าใน.bash_profileนั้นผมก็ต้องทำทุกครั้งที่ฉันขั้วเปิดทางลัดsource ~/.bash_profile Ctrl+Alt+T
Vicky Dev

@VickyDev หากคุณต้องทำsource ~/.bash_profileทุกครั้งนั่นเป็นข้อบ่งชี้ว่าการตั้งค่า Bash ของคุณนั้นไม่ได้มาตรฐานหรือแตกหัก (ตามที่man bashระบุไว้) คุณแน่ใจหรือว่าคุณกำลังใช้ Bash อยู่ ตัวอย่างเช่นecho $BASHPIDพิมพ์อะไรบ้าง
l0b0

คุณต้องการเพิ่ม#!/bin/shไปด้านบน.profileเพื่อกำหนดฟังก์ชั่นหรือไม่?
Kolob Canyon

13

หลังจากที่คุณกำหนดฟังก์ชั่นในของคุณเพิ่ม.profile export -f date1สิ่งนี้จะส่งออกฟังก์ชันเพื่อใช้งานโดยเชลล์ล็อกอินของคุณ


+1 เพื่อการส่งออกฉันต้องเรียกใช้และนามแฝงใน ssh ProxyCommand และมันยังคงเป็นเรื่องเกี่ยวกับนามแฝงที่ไม่พบแม้จะอยู่หลังไฟล์. profile ทำงานเหมือนจับใจหลังจากส่งออก
Abhishek Anand

7

~/.bashrcการปรับแต่งสำหรับเปลือกหอยโต้ตอบไปสู่ สิ่งที่คุณต้องการเรียกใช้เมื่อคุณเข้าสู่ระบบ~/.profile(หรือ~/.bash_profileแต่มักจะไม่โหลดเมื่อเข้าสู่ระบบแบบกราฟิก)

~/.bashrcใส่คำนิยามของฟังก์ชั่นนี้

ตั้งแต่ทุบตีไม่โหลด.bashrcเมื่อมันเป็นเปลือกเข้าสู่ระบบบังคับให้ทำเช่นนั้น: เขียน~/.bash_profileที่มี

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

เช่นโหลด~/.profileและโหลด~/.bashrcถ้าเชลล์เป็นแบบโต้ตอบ

ดูทางเลือกของ. bashrcและโพสต์ลิงก์ที่นั่น


1

csh และ tcsh ไม่รองรับฟังก์ชั่นเช่น bash แต่คุณสามารถทำได้

ตัวอย่างเช่นนี่เป็นฟังก์ชั่นง่าย ๆ ในการพิมพ์ข้อความ

alias print_hello_world 'eval echo "hello world"'

ผ่านการขัดแย้งกับสคริปต์

repeate_after_me 'eval echo "$1"'

การทำโค้ดหลายบรรทัดเช่นคำสั่ง if ค่อนข้างซับซ้อน แต่ที่นี่คุณไป

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

คุณจะต้องทำการ eval แต่ส่วนที่ซับซ้อนที่สุดคือการทำ\!:[x]ไวยากรณ์เพื่อรับอินพุตจากบรรทัดคำสั่ง

นั่นควรจะเพียงพอที่จะทำให้คุณแยกออก


0

คุณสามารถเปลี่ยนฟังก์ชั่นในปัจจุบันทั้งหมดจะ bashrc กับเรียงพิมพ์

ตัวอย่างเช่นนี่คือวิธีที่ฉันเพิ่มฟังก์ชันของคำสั่ง openstack พร้อมพารามิเตอร์ทางเลือกลงใน bashrc:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

ตอนนี้มันถูกบันทึกไว้สำหรับเซสชันในอนาคตและสามารถใช้เช่น:

$ urc 

หรือ

$ urc --debug

-1

จุดที่ 18: ในความทรงจำเก่าของฉันเมื่อผู้ดูแลการเรียนรู้ ksh และทุบตีเป็น kina วิธีอื่น ๆ 1: - / / เนื้อหาอื่น ๆ ของโปรไฟล์เป็น sysWide / etc / skel มีไฟล์ที่มอบให้กับบัญชีใหม่ ตั้งแต่ตอนนี้ทุบตีนายกทั่วไปของ distro ทั้งหมด ถัดไปจะเป็น 2: - ~ / .profile ตามมาตรฐานระบบจากนั้นภายในเนื้อหาของ. profile "ถ้ามีอยู่" .bash_profile จะใส่ -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases จะอยู่ใน ความคิดของฉันคือลำดับที่ถูกต้องมากขึ้นตั้งค่าเทอร์มินัลมาตรฐานและสภาพแวดล้อมของเชลล์และ. bash_login ปกติไม่เคยพบหรือมีอยู่ (กำหนดเองต่อผู้ใช้) ด้วย. โปรไฟล์ $ PATH เป็นหลักถ้า
ฉันกำลังค้นหาอยู่ในขณะนี้เพิ่มด้วย. bash_profile. profile ยังคงมีอำนาจเหนือและไม่เคารพสถานะของ. bash_profile พร้อมกับข้อมูลส่วนหัวไม่มีใครอัปเดตเช่น: bash startup ตัวอย่าง - โครงสร้างไดเรกทอรีนั้นไม่มีอีกต่อไป - พร้อมกับตัวอย่างและหรือไฟล์จะ gzip'd ดังนั้นการอัปเดต Gnu-Bash นั้นเป็นไปตามลำดับ


1
คุณกำลังทำอะไรอยู่
Jesse_b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.