ตัดไดเรกทอรีการทำงานของพรอมต์คำสั่งเทอร์มินัล


39

เมื่อใช้เครื่องเทอร์มินัลในโครงสร้างโฟลเดอร์แบบลึกบางครั้งพรอมต์สามารถใช้งานได้เกือบทุกบรรทัด มีวิธีใดบ้างที่ฉันสามารถตัดทอนไดเร็กตอรี่ที่ทำงานได้? ฉันรู้ว่าฉันสามารถทำ

PS1="\W >"

เพื่อพิมพ์เฉพาะไดเรกทอรีปัจจุบันและไม่ใช่เส้นทางแบบเต็ม แต่มีวิธีการเช่น:

/home/smauel/de...ther/folder >

คำตอบ:


30

สร้างสคริปต์หลามขนาดเล็กซึ่งใช้ตรรกะการตัดแต่งที่ต้องการ

ตัวอย่าง: ~/.short.pwd.py

import os
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

ตอนนี้ทดสอบจาก terminal:

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

~/.bashrcหากคุณมีความตกลงมีผลเพียงแค่ต่อท้ายคำสั่งเพื่อคุณ


ไม่ต้องถามชัดเจน แต่เราจะเพิ่มคำสั่งต่อท้าย~/.bashrcอย่างไร มันจะถูกวางบรรทัดสุดท้ายที่ด้านล่างของไฟล์?
FloatingRock

1
@FloatingRock ถูกต้อง เพียงเพิ่มลงในไฟล์. bashrc
คำนำหน้า

มันเยี่ยมมาก! หากคุณแก้ไขโปรแกรมไพ ธ อนมันจะอัพเดตโดยอัตโนมัติ: sweet!
N3sh

เย็น! ขโมยสิ่งนี้ทันที
ferdy

อัปเดตการพิมพ์ครั้งสุดท้าย ... เพื่อพิมพ์ (... ) เพื่อให้งานนี้ใกล้เคียงกับ python 3 เช่นกันเคล็ดลับที่ยอดเยี่ยมขอบคุณสำหรับการแบ่งปัน !!
Sean

69

หากคุณใช้ bash4 (Ubuntu 9.10 และใหม่กว่ามี bash4) ตัวเลือกที่ง่ายที่สุดคือตั้งค่าตัวแปร PROMPT_DIRTRIM เช่น:

PROMPT_DIRTRIM=2

สำหรับหนึ่งที่คล้ายกับตัวอย่างของJoão Pinto (ที่จะทำงานในเวอร์ชันทุบตีที่เก่ากว่าและตรวจสอบให้แน่ใจว่าองค์ประกอบเส้นทางไม่เกิน 30 ตัวอักษร) คุณสามารถทำสิ่งนี้:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
เอกสารสำหรับ PROMPT_DIRTRIM สามารถดูได้ที่นี่: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos

11

อีกวิธีหนึ่งในการแก้ไขปัญหานี้คือการรวมตัวแบ่งบรรทัดลงใน PS1 เพื่อให้ไดเรกทอรีการทำงานและพรอมต์ที่แท้จริงปรากฏขึ้นในบรรทัดที่แยกต่างหากตัวอย่างเช่น

PS1="\w\n>"

คล้ายกับ Thiis คือการไม่เปลี่ยน PS1 ของคุณพรอมต์ แต่เพียงแค่เริ่มต้นคำสั่งของคุณกับ \ และกดEnter สิ่งนี้บังคับให้คำสั่งเริ่มต้นในบรรทัดถัดไปด้วยพรอมต์ PS2 ซึ่งโดยปกติแล้ว> ... (ฉันไม่เคยคิดเลยจนกว่าฉันจะเห็นคำแนะนำของคุณ :)
Peter.O

4

เพิ่มที่ด้านล่างของคุณ ~/.bashrc

split_pwd() {
        # Only show ellipses for directory trees -gt 3
        # Otherwise use the default pwd as the current \w replacement
        if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
                pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
        else
                pwd
        fi
}


export PS1="\$(split_pwd) > "

เป็นที่ยอมรับว่าอาจจะสะอาดกว่านี้ แต่ฉันต้องการที่จะทำลายมัน

ผลลัพธ์ที่คาดหวังสำหรับไดเรกทอรีมากกว่าสามชั้น

/home/chris/../Node Projects >

ผลลัพธ์ที่คาดหวังสำหรับไดเรกทอรีจากเดสก์ท็อปและย้อนกลับ

/home/chris/Desktop > 
/home/chris >  
/home

สวย! ฉันแค่ต้องเพิ่มสมาร์ทบางอย่างเกี่ยวกับการเปลี่ยน $ HOME เป็น "~ /" และไม่นับว่าเป็นส่วนหนึ่งของ 'ความยาว' ถ้า $ PWD อยู่ภายใต้โฮมไดเรกทอรี
Michael Burr

1

คำตอบที่ยอดเยี่ยมของ @ joão-pinto ขนาดเล็กนี้เพิ่มในชื่อสภาพแวดล้อมเสมือนเมื่อคุณเรียกใช้workonคำสั่ง

import os
from platform import node
hostname = node().split('.')[0]
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# check for the virtualenv
ve = os.getenv('VIRTUAL_ENV')

if ve:
    venv = '(`basename \"$VIRTUAL_ENV\"`)'
else:
    venv = ''

if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '%s[%s@%s:%s] ' % (venv, username, hostname, pwd)

อ๊ะความคิดที่ดี ... บางทีอาจรวมกับรหัสสีของฉันด้วย
ไมค์หนู

1

ตามคำตอบของCris Sullivanแต่เก็บไว้~สำหรับโฟลเดอร์บ้าน

get_bash_w() {
  # Returns the same working directory that the \W bash prompt command
  echo $(pwd | sed 's@'"$HOME"'@~@')
}

split_pwd() {
  # Split pwd into the first element, elipsis (...) and the last subfolder
  # /usr/local/share/doc --> /usr/.../doc
  # ~/project/folder/subfolder --> ~/project/../subfolder
  split=2
  W=$(get_bash_w)
  if [ $(echo $W | grep -o '/' | wc -l) -gt $split ]; then
    echo $W | cut -d'/' -f1-$split | xargs -I{} echo {}"/../${W##*/}"
  else
    echo $W
  fi
}

export PS1="\$(split_pwd) > "

คุณไม่จำเป็นต้องส่งออก PS1 ที่นี่หรือ ดูดี.
Chris Sullivan

ใช่คุณยังต้องส่งออก PS1 ตามรายละเอียดในคำตอบ ฉันเพิ่งเพิ่มไดเรกทอรีการทำงาน :-)
Manuel

0

ฉันชอบอันนี้มากที่สุด PS1="[\W]\\$ "


OP กล่าวว่าพวกเขาไม่ได้เกี่ยวข้องกับเรื่องนั้น
wjandrea

0

พรอมต์นี้จะทำให้ชื่อทั้งหมดสั้นลงยกเว้นบรรทัดปัจจุบัน:

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '

0

เพียงอัปเดตเล็กน้อย (สำหรับ Python3) และปรับปรุงคำตอบที่เลือกเพื่อเพิ่มสีให้กับพรอมต์ตามคำสั่ง BASH (ใน Linux Mint 18.3 ต่อไป):

#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

if len(pwd) > 40:
    # first 10 chars+last 30 chars
    pwd = pwd[:10] + '...' + pwd[-30:] 

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (username, hostname, pwd) )

เพิ่มเติมเกี่ยวกับรหัสสีในทุบตีเทอร์มินี่ อาจมีวิธีการค้นหาว่าเทอร์มินัลของคุณใช้สีใดโดยอัตโนมัติ แต่ฉันไม่ทราบว่าอาจเป็นเช่นไร

ด้วยเส้น Shebang บรรทัดexportสำหรับการรวมใน. bashrc จะกลายเป็น:

export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1 รหัสหนี "\ e" เหล่านี้จะต้องอยู่ใน "\ [... \]" เสมอมิฉะนั้นการคืนบรรทัดจะทำให้เกิดความสับสน

NB2 เพื่อรับเส้นทางที่สมบูรณ์ของคุณได้ตลอดเวลาเพียงไป

... $ pwd 

แน่นอน...

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