প্রতি ডিরেক্টরি বাশ / zsh ইতিহাস লগ ফাইল


14

আমি একটি ডিরেক্টরি ডিরেক্টরিতে একটি প্রকল্পে অনেক কাজ করতে দেখি। কখনও কখনও - কয়েক মাস ট্র্যাকের নিচে - আমাকে সেই প্রকল্পে কিছু করতে হবে তবে আমি কী করেছি তা মনে করতে পারছি না। আমি ফাইলগুলিতে পরিবর্তনগুলি ট্র্যাক করতে মার্উরিয়াল বা গিট ব্যবহার করি তবে আমি সেই ডিরেক্টরিতে কী আদেশগুলি জারি করেছি তা মনে রাখতে সক্ষম হতে চাই।

আমার শেলের ইতিহাস অনুসন্ধান করা খুব তথ্যমূলক নয়। আমি ইতিমধ্যে আমার। * _ ইতিহাসের ফাইলগুলিতে সমস্ত কিছু লগইন করেছি, তবে আমি things / foo / বারে যা কিছু করেছি তার একটি তালিকা চাই এবং আমি এই সপ্তাহে যে সমস্ত অন্যান্য (মিলিয়ন) কাজ করেছিলাম তা নয়। আমি সম্ভবত এটি নির্দিষ্ট প্রকল্পে শেষ মাসে কোন মাসে কাজ করেছি তা মনে করতেও পারি না।

আমি ব্যবহার করেছি এমন সমস্ত শেল কমান্ডের একটি প্রকল্প ডিরেক্টরি লগ ফাইল কীভাবে কারও কোনও ধারণা আছে? আমি একটি কমান্ড এরকম কিছু কল্পনা করছি:

ওয়ার্কন মাইপ্রজেক্ট

... যা শেল লগ ফাইলটি ~ / মাইপ্রজেক্ট / .history.log এ সেট করে, সেই লগফিল থেকে পূর্ববর্তী ইতিহাসটি লোড করে এবং আমি কোন ডিরেক্টরিতে কাজ করছি তা বলতে আমার প্রম্পটটি আপডেট করে (যেমন সংস্করণ সরবরাহ করার জন্য vcprompt নিয়ন্ত্রণ তথ্য)।

এখানে কিছু আছে কি?

উত্তর:


4

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

স্থাপন

pip install virtualenvwrapper

অথবা

easy_install virtualenvwrapper

এবং আপনার শেল কনফিগারেশনে সূচনা উপাদান যুক্ত করুন ( ~/.zshrc, ~/.bashrc)

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$WORKON_HOME/projects
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
source /usr/local/bin/virtualenvwrapper.sh

ব্যবহার

# create your env
mkvirtualenv my_project

# edit per project hooks
vim ~/.virtualenvs/my_project/bin/{postactivate,preactivate,predeactivate,etc}

# work in this env
workon my_project

আপনার কাছে জেনেরিক হুক ~/.virtualenvs/{postactivate,postdeactivate,etc}রয়েছে যা প্রতিবার আপনাকে বলা হয় workon any_project

সুতরাং, উদাহরণস্বরূপ, হুকের export HISTFILE="$VIRTUAL_ENV/bash_history"মধ্যে লাইন থাকার ~/virtualenvs/postactivateঅর্থ $HISTFILEচলকটি প্রতিবার একটি ভিন্ন প্রকল্পে প্রসারিত হবে।


3

আমার এটিও দরকার এবং আমি এমন একটি সংস্করণ নিয়ে এসেছি যা ব্যাশের PROMPT_COMMAND ভেরিয়েবল ব্যবহার করে :

প্রতিটি প্রাথমিক প্রম্পট বাশ মুদ্রণের ঠিক আগে ভেরিয়েবলের PROMPT_COMMAND এর মান পরীক্ষা করা হয়। যদি PROMPT_COMMAND সেট করা থাকে এবং একটি নন-নাল মান থাকে, তবে মানটি ঠিক একইভাবে কার্যকর করা হয় যেমন এটি কমান্ড লাইনে টাইপ করা হয়েছিল।

সুতরাং আমি বলি PROMPT_COMMAND = check / .bashrc.my- এ "check_for_local_history", যেখানে আমার check_for_local_historyএমন একটি ফাংশন যা পরীক্ষা করে যে শেষ মৃত্যুদন্ড কার্যকর করা কমান্ডটি ডিরেক্টরি পরিবর্তন ছিল কিনা, এবং যখন সত্য হয়, এটি .bash_history ফাইলের জন্য নতুন বর্তমান ডিরেক্টরিটি পরীক্ষা করে । যদি এটি সেখানে থাকে তবে এটি ইতিহাসের ফাইল হিসাবে ব্যবহার করুন।

এখানে সম্পূর্ণ বক্তব্য: https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

একটি পণ্যটির জন্য সাব-প্যাকেজগুলি গঠনের কাঠামোর জন্য আমি যে কৌশলটি ব্যবহার করি তা হ'ল একটি উপ-শেল ব্যবহার।

বাশের জন্য আপনি এই জাতীয় শেল স্ক্রিপ্ট তৈরি করতে পারেন:

#!/bin/bash

export PROJECT_DIRECTORY=$(pwd)

exec bash --rcfile $HOME/.project-bashrc

তারপরে আপনি $HOME/.project-bashrcএই জাতীয় কিছু রাখুন:

source $HOME/.bashrc
export HISTFILE="${PROJECT_DIRECTORY}/.bash_history"
cd "${PROJECT_DIRECTORY}"

এটি আপনাকে .project-bashrcফাইলটিতে প্রম্পটটি কাস্টমাইজ করতে দেয় যা সহজেই কার্যকর হতে পারে।

আমি কীভাবে এটি করতে পারি তা নিশ্চিত নই zshZDOTDIRআমার মনে হয় আপনাকে ভেরিয়েবলটি ওভাররাইড করতে হবে । তবে এটি দেখতে একই রকম লাগবে।

Ciao!


1

আমার লগিং স্ক্রিপ্টগুলি এখানে দেখুন । এর মধ্যে একটি ব্যবহার করে, আপনি প্রতিটি কমান্ড জারি করার পরে আপনি কোন ডিরেক্টরিতে রয়েছেন তা ট্র্যাক করে রাখতে পারেন। আপনি grepকমান্ড বা অন্যান্য তথ্যের জন্য লগ ফাইল করতে পারেন । আমি বাড়িতে এবং কর্মক্ষেত্রে দীর্ঘ সংস্করণ ব্যবহার করি।


ধন্যবাদ - আমি এটি একবার দেখুন। আমার যা প্রয়োজন তার কাছাকাছি কিছু করতে পারে!
সাইমন

1

Zsh এর জন্য ডিরেক্টরি-ইতিহাস নামে আমার লেখা একটি প্লাগইনে আপনার আগ্রহ থাকতে পারে ।
এখানে দেখুন: https://github.com/tymm/directory-history

যদিও এটি আপনার ওয়ার্কন মাইপ্রজেক্ট ওয়ার্কফ্লোতে সত্যিই ফিট করে না , এটি আপনার প্রয়োজনগুলির সাথে পুরোপুরি ফিট করে।

এটি একটি ইতিহাস তৈরি করে যা ডিরেক্টরিগুলি অন্তর্ভুক্ত করে।
আপনি যখন আপনার ইতিহাস অনুসন্ধান করেন, আপনি প্রথমে আপনার যে ডিরেক্টরিটিতে ছিলেন সেগুলি থেকে কমান্ড পাবেন
that যদি সেই ডিরেক্টরিটির জন্য কোনও কমান্ড না থাকে তবে এটি কোনও বিশ্ব ইতিহাসে ফিরে যাবে এবং অন্যান্য ডিরেক্টরিতে ব্যবহৃত কমান্ডের পরামর্শ দেবে।


1

আপনি যদি কিছু সাধারণ চান তবে আপনার .history.logফাইলটি এমন থাকতে পারে :

#!/bin/cat
some
relevant
commands

তারপরে ফাইলটি চালানো catআপনি যে কমান্ডগুলিতে তালিকাভুক্ত হয়েছেন সেগুলি হবে।
কনভেনশন হিসাবে কার্যকারিতা দ্বারা আপনি পৃথক ফাইলে সেই আদেশগুলিও গ্রুপ করতে পারেন:

.howto.datadump
.howto.restart

এটি বাক্সের বাইরে কাজ করার এবং আপনার পরিবেশকে দূষিত না করার অতিরিক্ত সুবিধা রয়েছে।


বিকল্পভাবে আপনি বিষয় প্রতি README.mdঅন্য .mdফাইলগুলি ব্যবহার করতে বা তৈরি করতে পারেন এবং তাদেরকে রেডমি থেকে নির্দেশ করতে পারেন। যদি আপনার কাছে একটি ডাউন ডাউন ফ্রেন্ডলি সোর্স কন্ট্রোল ইন্টারফেস থাকে।
রেনো

1

ডিরেক্টরিতে স্থানীয় ইতিহাস ফাইলটি পেতে আমি আমার বাশ প্রম্পট কমান্ডের সাথে নিম্নলিখিত লাইনটি যুক্ত করেছি।

if [ -f .local_history ] ; then tail -1 $HISTFILE >> .local_history ; fi

touch .local_historyএরপরে একটি ডিরেক্টরিতে কমান্ড আমাকে সেই ইতিহাসে চালিত সমস্ত কমান্ডের জন্য স্থানীয় ইতিহাসের ফাইল দেয়, প্রধান ইতিহাস ফাইলটি বাদ না দিয়ে। আমার মতামত zsh এ একই রকম কিছু কাজ করবে।


0

কমপক্ষে ব্যাশে হিস্টফিলের কেবল শেল ইনস্ট্যান্সের শুরুতে পরামর্শ করা হয়। প্রতি-দির আইডিয়া এখানে কাজ করবে না, যদি না আপনার উপরের 'ওয়ার্কন' উদাহরণটি শেলের উদাহরণ তৈরি করে।

আপনি যেমন কিছু তাকান করতে পারেন

alias workon='script ./.history.log'

তবে স্ক্রিপ্ট একটি সাবশেল তৈরি করে।

সংক্ষেপে, এটিকে কাজ করতে আপনাকে সম্ভবত বিশ্রী স্তরের সাব-শেলগুলি প্রয়োজন।


অভিশাপ, আমি আশা করছিলাম যে এটি কিছু সাধারণ হবে। যাই হোক ধন্যবাদ!
সাইমন

0

আমি প্রোডাকশন সফটওয়্যার হাউসে কাজ করেছি যেখানে আমরা কেবলমাত্র বিভিন্ন কার্যক্রমে নতুন ব্যবহারকারী এবং গোষ্ঠী তৈরি করব create কনফিগারেশন ম্যানেজমেন্ট বা সফ্টওয়্যার সম্পর্কিত নতুন ব্যবহারকারীর অ্যাকাউন্টগুলি গ্রুপের সদস্যপদ এবং এসিএল এর মাধ্যমে সম্পর্কিত সম্পর্কিত ক্রিয়াকলাপে বিভিন্ন স্তরের দৃশ্যমানতা তৈরি করে এবং কমান্ডের ইতিহাসে cmmgrসংরক্ষণ করা হবে ~cmmgr/.bash_history, bldmgrসম্পর্কিত শব্দটি সংরক্ষণ করা হবে ~bldmgr/.bash_historyইত্যাদি। দুর্ভাগ্যক্রমে, লগইন করতে, ব্যবহারকারীর অবশ্যই তাদের লগইন ডিরেক্টরিটির মালিক হতে হবে। অতএব, একটি প্রকল্প এলাকা সম্পূর্ণ আলাদা ডিস্কে সেট আপ করা হয়েছিল set ফাইল স্রষ্টার মালিকানা দেখিয়েছে যে প্রকল্পের অঞ্চলগুলিতে কোন কার্যকরী অঞ্চল ফাইলগুলি তৈরি করেছে, যার জন্য উপযুক্ত .bash_historyপরীক্ষা করা যেতে পারে।

উপরের পদ্ধতিটি, আপনার ইচ্ছা মতো গ্রানুলারিটি দেয় না, তবে এটি আপনাকে একটি কঙ্কাল দেয় যা গোষ্ঠী সদস্যতার সাথে একত্রিত হলে, কোনও ব্যবহারকারী এমন গ্রুপগুলিতে স্যুইচ করতে পারে newgrpযা কার্যকরভাবে একটি নতুন শেল এবং পরিবেশ তৈরি করে, এবং তারপরে একটি ব্যবহার করে অন্যান্য উত্তরে প্রদত্ত পদ্ধতির মধ্যে টুপিগুলি বলার জন্য স্যুইচ করার ~/.bash_historyসময় কার্যকর ফাইলটিকে পরিবর্তন করার জন্য, যাতে কমান্ডের মাধ্যমে নতুন ফোল্ডারে প্রবেশের সাথে সাথে প্রতি ফোল্ডারটিতে কোনটি ব্যবহৃত হয় এবং সেভ হয় তা পরিচালনা করতে পারে । চেক আউট । এই প্রশ্নের অন্যান্য উত্তরে এই লাইন বরাবর কিছু সূচনা পয়েন্ট আছে। এগুলি ইউএনআইএক্স গ্রুপের দৃষ্টান্তের সাথে কাজ করা উচিত - বেশিরভাগ বাদাম এবং বল্টগুলি শেল স্টার্টআপ এবং প্রস্থান রুটিন দ্বারা পরিচালিত হয় যেমন দ্বারা নিয়ন্ত্রিত হয়cmmgrnewgrp~/.bash_historynewgrpman newgrpnewgrpআবাহন। চেক আউট newgrp -l:

NAME
     newgrp -- change to a new group

SYNOPSIS
     newgrp [-l] [group]

DESCRIPTION
     The newgrp utility creates a new shell execution environment with modified real and effective group
     IDs.

     The options are as follows:

     -l      Simulate a full login.  The environment and umask are set to what would be expected if the user
             actually logged in again.

0

এখানে আমি দুটি রূপ উপস্থাপন করছি তবে কেবল জেড শেলের ক্ষেত্রে প্রযোজ্য ।

বৈকল্পিক ঘ

আপনার প্রশ্নের শিরোনামটি পড়ার সময় আমি এটিই প্রথম ভেবেছিলাম। এই বৈকল্পিকের সাহায্যে আপনি ALT+ h: গ্লোবাল বা স্থানীয় সহ দুটি ইতিহাসের মোডের মধ্যে স্যুইচ করতে পারেন , যেখানে পরেরটি chdir এর পরে স্বয়ংক্রিয়ভাবে প্রতি-ডিরেক্টরি ইতিহাসে স্যুইচ করে । গ্লোবাল ইতিহাস সমস্ত জারি কমান্ড একত্রিত করে।

  • প্রদর্শন

    s উত্স src / cd_history
    global বিশ্বব্যাপী ইতিহাস প্রতিধ্বনিত                                                
    বিশ্ব ইতিহাস
    k mkdir foo বার                                                      
    ~ [Alt-জ] 
    ~                          স্থানীয় ইতিহাসের জন্য নির্দেশক নোট ->    + +
    ~ সিডি ফু +
    oo / foo foo এ স্থানীয় ইতিহাস প্রতিধ্বনিত
    Foo স্থানীয় ইতিহাস
    ~ / foo fc -l +
        Foo এ স্থানীয় প্রতিধ্বনি 1
    ~ / ফু সিডি .. / বার +
    + / বার বারে স্থানীয় ইতিহাস প্রতিধ্বনিত করে
    বারে স্থানীয় ইতিহাস
    bar / বার এফসি-এল +
        স্থানীয় বারে প্রতিধ্বনি 1
    ~ / বার সিডি ../foo +
    ~ / foo fc -l +
        Foo এ স্থানীয় প্রতিধ্বনি 1
        3 সিডি .. / বার
    ~ / ফু [ALT-h]                                           
    ~ / foo fc -l                                                          
       55 উত্স src / cd_history
       64 প্রতিধ্বনি বিশ্ব ইতিহাস
       65 এমকিডির ফু ফু
       66 সিডি ফু
       70 বারে স্থানীয় ইতিহাস প্রতিধ্বনিত
       72 সিডি ../foo
       73 প্রতিশ্রুতিবদ্ধ স্থানীয় ইতিহাস প্রতিধ্বনি
       74 সিডি .. / বার
    ~ / Foo বিন্যাস  
  • স্ক্রিপ্ট (এতে অন্তর্ভুক্ত ~/.zshrcবা উত্সাহিত হতে হবে)

    # set options for shared history
    setopt prompt_subst
    setopt share_history
    setopt hist_ignorealldups
    
    # define right prompt as an indicator if local (i.e. per directory) history is enabled
    RPS1=' ${HISTLOC}'
    export HISTLOC=''
    
    # configure global history file and global/local history size
    export HISTGLOBAL=$HOME/.zsh_history
    touch $HISTGLOBAL
    export HISTSIZE=2000
    export SAVEHIST=2000
    
    # define wrapper function and key binding to switch between globel and per-dir history
    function my-local-history()
    {
      if [[ -z $HISTLOC ]]; then
        HISTLOC='+'
        chpwd
      else
        HISTLOC=''
        export HISTFILE=$HISTGLOBAL
        fc -A $HISTFILE
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
      fi
      zle reset-prompt
    }
    zle -N my-local-history
    bindkey "^[h"    my-local-history
    
    # install hook function which is called upon every directory change
    chpwd () {
      if [[ ! -z $HISTLOC ]]; then
        fc -A $HISTGLOBAL $HISTSIZE $SAVEHIST
        export HISTFILE=$PWD/.zsh_history
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
        touch $HISTFILE
      fi 
    }
    

বৈকল্পিক 2

এটি নিয়ে আবার ভাবলে, মনে হয় যে প্রতি-দিরের ইতিহাসটি খুব সূক্ষ্ম দানাযুক্ত এবং আপনি নিজের প্রশ্ন-সংস্থায় আরও বেশি প্রকল্পের ইতিহাস বর্ণনা করেছেন। তাই আমি প্রকল্পগুলির মধ্যে স্যুইচ করার জন্য একটি ওয়ার্কন ফাংশন নিয়ে আরেকটি রূপ নিয়ে এসেছি । প্রতিটি প্রকল্পের নিজস্ব ইতিহাস ফাইল রয়েছে ~/.zsh_projhistory_[name]

  • প্রদর্শন

    s উত্স src / proj_history 
    global বিশ্বব্যাপী ইতিহাস প্রতিধ্বনিত                                                                    
    বিশ্ব ইতিহাস
    ~ [ALT-h]                                                               [ওয়ার্কন ব্যবহার করুন]
    ~ workon foo [workon ব্যবহার করুন]
    f প্রজেক্ট foo এ ইকো কমান্ড
    প্রকল্প foo কমান্ড
    ~ এফসি-এল [প্রজ ফুতে]
        প্রজেক্ট ফুতে 1 ইকো কমান্ড
    ~ ওয়ার্কন বার [প্রজ ফুতে]
    another আরেকটি প্রজ প্রতিধ্বনিত করুন, নামক বার [প্রজ বারে]
    আরেকটি প্রজ, বার নামক
    ~ fc -l [প্রজ বারে]
        1 বারের মতো আরেকটি প্রজ প্রতিধ্বনিত করে
    ~ workon foo [প্রোজ বারে]
    ~ এফসি-এল [প্রজ ফুতে]
        প্রজেক্ট ফুতে 1 ইকো কমান্ড
        3 ওয়ার্কন বার
    ~ [ALT-h]                                                              [প্রজ ফুতে]
    ~
    ~ এফসি-এল                                                                                   
       31 বিশ্বব্যাপী ইতিহাস প্রতিধ্বনি
       36 বারের মতো আরও একটি প্রজ প্রতিধ্বনিত করে
       38 workon foo
       39 প্রকল্পের foo এ ইকো কমান্ড
       40 workon বার
    s ls -1 .zsh_ *
    .zsh_history
    .zsh_projhistory_bar
    .zsh_projhistory_foo
  • স্ক্রিপ্ট (এতে অন্তর্ভুক্ত ~/.zshrcবা উত্সাহিত হতে হবে)

    # set options for shared history
    setopt prompt_subst
    setopt share_history
    setopt hist_ignorealldups
    
    # define right prompt as an indicator if local (i.e. per directory) history is enabled
    RPS1=' ${HISTLOC}'
    export HISTLOC=''
    
    # configure global history file and global/local history size
    export HISTGLOBAL=$HOME/.zsh_history
    touch $HISTGLOBAL
    export HISTFILE=$HISTGLOBAL
    export HISTSIZE=2000
    export SAVEHIST=2000
    
    # define wrapper function and key binding to switch between globel and per-dir history
    function my-local-history()
    {
      if [[ -z $HISTLOC ]]; then
        if [[ -z $HISTLOC ]]; then
          HISTLOC='+'
          [[ -z "$HISTPROJ" ]] && HISTLOC='[use workon]' || workon "$HISTPROJ"
        fi
      else
        HISTLOC=''
        export HISTFILE=$HISTGLOBAL
        fc -A $HISTFILE
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
      fi
      zle reset-prompt
    }
    zle -N my-local-history
    bindkey "^[h"    my-local-history
    
    # function to change project
    workon () {
      if [[ -z "$1" ]]; then
        echo Usage: workon [project name]
        return 1
      fi
      export HISTPROJ="$1"
      if [[ ! -z $HISTLOC ]]; then
        fc -A $HISTGLOBAL $HISTSIZE $SAVEHIST
        export HISTFILE=$HOME/.zsh_projhistory_"$HISTPROJ"
        fc -p "$HISTFILE" $HISTSIZE $SAVEHIST
        touch "$HISTFILE"
        HISTLOC="[on proj $HISTPROJ]"
      fi 
    }

0

কিছুক্ষন এক জায়গায় কাজ করার পরে।

ইতিহাস> ইতিহাস 1.txt এরপরের ইতিহাস> ইতিহাস 2.txt

কখনও কখনও আমি ফাইলের জন্য তারিখটি ব্যবহার করি। ইতিহাস> hist20180727.txt

এইভাবে প্রতিটি ডিরেক্টরিের জন্য সাম্প্রতিক কমান্ডের ইতিহাস রয়েছে।

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