cắt thư mục làm việc nhanh chóng lệnh


39

Khi sử dụng thiết bị đầu cuối trong cấu trúc thư mục sâu đôi khi lời nhắc có thể chiếm phần lớn dòng. Có cách nào để tôi có thể cắt thư mục làm việc không? Tôi biết tôi có thể làm

PS1="\W >"

để chỉ in thư mục hiện tại và không phải đường dẫn đầy đủ, nhưng có một cách để có một cái gì đó như:

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

Câu trả lời:


30

Tạo một kịch bản python nhỏ thực hiện logic cắt tỉa mong muốn.

Thí dụ: ~/.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)

Bây giờ hãy kiểm tra nó, từ một thiết bị đầu cuối:

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

Nếu bạn ổn với kết quả, chỉ cần nối lệnh vào lệnh của bạn ~/.bashrc.


Không hỏi rõ ràng, nhưng chính xác làm thế nào để chúng ta nối lệnh vào ~/.bashrc? Nó sẽ chỉ dán dòng cuối cùng ở dưới cùng của tập tin?
FloatingRock

1
@FloatingRock đúng. Chỉ cần thêm nó vào tệp .bashrc.
Tiền tố

Điều đó thật tuyệt! Nếu bạn chỉnh sửa chương trình python, nó sẽ tự động cập nhật: ngọt ngào!
N3sh

mát mẻ! lập tức lấy trộm cái này.
16:51

Cập nhật bản in cuối cùng ... để in (...) để có được tác phẩm này gần như là dành cho python 3, mẹo hay, cảm ơn vì đã chia sẻ !!
Sean

69

Nếu bạn đang sử dụng bash4 (Ubuntu 9.10 và mới hơn có bash4), tùy chọn đơn giản nhất là chỉ đặt biến PROMPT_DIRTRIM. ví dụ:

PROMPT_DIRTRIM=2

Đối với một ví dụ tương tự như ví dụ của João Pinto, (sẽ hoạt động trong các phiên bản bash cũ hơn và đảm bảo rằng thành phần đường dẫn không bao giờ dài hơn 30 ký tự), bạn có thể làm một cái gì đó như thế này:

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

4
Tài liệu cho PROMPT_DIRTRIM có thể được tìm thấy ở đây: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos

11

Một cách khác để giải quyết vấn đề đó là bao gồm ngắt dòng vào PS1, để thư mục làm việc và lời nhắc thực tế xuất hiện trên các dòng riêng biệt, ví dụ:

PS1="\w\n>"

Tương tự như thiis, là không thay đổi lời nhắc PS1 của bạn, mà chỉ bắt đầu lệnh của bạn bằng một \ và nhấn Enter . Điều này buộc lệnh bắt đầu trên dòng tiếp theo với dấu nhắc của PS2, thường là > ... (Tôi đã không nghĩ đến nó cho đến khi tôi thấy đề xuất của bạn :)
Peter.O

4

Thêm phần này vào dưới cùng của bạn ~/.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) > "

Phải thừa nhận rằng điều này có thể sạch hơn, nhưng tôi muốn có một vết nứt tại nó.

Đầu ra dự kiến ​​cho các thư mục sâu hơn ba lớp.

/home/chris/../Node Projects >

Đầu ra dự kiến ​​cho các thư mục từ Desktop và trở lại.

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

Đẹp! Tôi chỉ cần thêm một số thông minh về việc chuyển $ HOME thành "~ /" và không tính đó là một phần của 'độ dài' nếu $ PWD nằm trong thư mục chính.
Michael Burr

1

Bổ sung nhỏ này cho câu trả lời tuyệt vời của @ joão-pinto thêm vào tên môi trường ảo khi bạn chạy workonlệnh.

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)

Điều này là hoàn toàn cần thiết! Nếu bạn không có nó, bạn sẽ cho rằng môi trường ảo Python của bạn không hoạt động khi ... vì lý do này, tôi không biết xấu hổ khi sử dụng nó để kết hợp với ý tưởng của mình (với màu sắc ...).
mike gặm nhấm

1

Dựa trên câu trả lời của Cris Sullivan , nhưng giữ ~thư mục nhà

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) > "

Bạn vẫn không cần xuất PS1 ở đây chứ ?? Trông rất tuyệt.
Chris Sullivan

Có, bạn vẫn cần xuất PS1, như bạn đã nêu chi tiết trong câu trả lời của mình. Tôi chỉ cần thêm thư mục làm việc :-)
Manuel

0

Tôi thích cái này nhất PS1="[\W]\\$ "


OP đã đề cập rằng họ không xen vào đó.
wjandrea

0

lời nhắc này rút ngắn tất cả các tên ngoại trừ dòng hiện tại này:

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

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

0

Chỉ cần cập nhật một chút (cho Python3) và nâng cao câu trả lời đã chọn để thêm màu vào lời nhắc theo lời nhắc BASH (dù sao trong 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:] 

# Virtual environment being used? Essential not to omit!
ve = os.getenv('VIRTUAL_ENV')
venv = '(`basename \"$VIRTUAL_ENV\"`)' if ve else ''

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

Thông tin thêm về mã màu trong BASH Terminal tại đây . Có lẽ có một số cách để tìm ra màu sắc mà Terminal của bạn sử dụng tự động, nhưng tôi không biết đó có thể là màu gì.

Với dòng shebang, exportdòng để đưa vào .bashrc sau đó trở thành:

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

NB1 các mã thoát "\ e" này phải luôn được đặt trong "\ [... \]", nếu không, các dòng trả về sẽ bị rối hoàn toàn.

NB2 để có được đường dẫn đầy đủ của bạn bất cứ lúc nào chỉ cần đi

... $ pwd 

tất nhiên...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.