技術雜談:PastebinCL - Paste Your Code from Terminal

PUBLISHED ON AUG 7, 2014
FacebookTwitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    Pastebin.com is a website where you can store and share text or code for a certain period of time. Pastebin support syntax highlight for a variety of programming language. However, it is sometimes tedious to open the website and copy-paste your code. PastebinCL is a small command line utility help you to paste text to Pastebin directly from terminal.

    Before compiling PastebinCL, you have to sign up a Pastebin account to get a unique developer api key. Then, download the tarball of PastebinCL from Pastebin website. Extract the tarball and compile with make. You need to enter your developer api key here. Then, you may or may not meet errors during the process. If you meet some problems, you need to modify src/Makefile to make PastebinCL. See later content for some tips.

    $ tar -xzf pastebincl-1.0.tar.gz
    $ cd pastebincl-1.0
    $ make
    cd src/ && make
    -e
    
    Enter your Pastebin Developper API Key (see http://pastebin.com/api), or leave blank to use the default one (may not work):
    # enter your Pastebin developer api key here

    Then, move pastebincl to any execution directory like /usr/local/bin for later use.

    To paste text with your Pastebin account, type pastebincl --usergen and input your account name and password:

    $ pastebincl --usergen

    There are two ways to use PastebinCL. You can type pastebincl with or without parameters and begin to type your text for paste. Next, press Ctrl-d to paste your text.

    $pastebincl -n hello -s python
    print "Hello World!"
    # press Ctrl-d...
    Submitting paste...
    Paste submitted successfully!
    URL: http://pastebin.com/VG858r4H

    Another way to paste text is to combine cat and pastebincl:

    $ cat example.rb | pastebincl -n "a example file" -s ruby

    To see more usage, type pastebincl --help in the terminal.

    Troubleshooting on OS X

    You may meet the following error:

    clang: error: -lcurl: 'linker' input unused
    make[1]: *** [CurlPost.o] Error 1
    make: *** [pastebincl] Error 2

    To solve the problem, modify src/Makefile and delete $(CXXLIBS) in the following section:

    # before modification...
    ConfigRead.o: ConfigRead.cpp
    	$(CXX) $(CXXLIBS) -c $< $(CXXFLAGS) -o $@ -DENCODING_KEY=\"${ENC_KEY}\"
    
    %.o: %.cpp
    	$(CXX) $(CXXLIBS) -c $< $(CXXFLAGS) -o $@
    
    # after modification...
    ConfigRead.o: ConfigRead.cpp
    	$(CXX) -c $< $(CXXFLAGS) -o $@ -DENCODING_KEY=\"${ENC_KEY}\"
    
    %.o: %.cpp
    	$(CXX) -c $< $(CXXFLAGS) -o $@
    

    Then, you may meet the following error:

    ConfigRead.cpp:50:12: error: comparison of constant with
          expression of type 'unsigned int' is always true
          [-Werror,-Wtautological-constant-out-of-range-compare]
          if(findpos!=string::npos)
             ~~~~~~~^ ~~~~~~~~~~~~

    In this case, modify src/Makefile and delete -Werror in CXXFLAGS:

    # before modification...
    CXXFLAGS=-Wall -Werror -O2
    
    # after modification...
    CXXFLAGS=-Wall -O2
    

    Troubleshooting on Ubuntu

    If you are using Ubuntu, you have to install libcurl4-dev, which is a virtual package. You may choose one from libcurl4-openssl-dev, libcurl4-nss-dev and libcurl4-gnutls-dev.

    $ sudo apt-get install libcurl4-openssl-dev

    Because Ubuntu replace bash with dash as default link of /bin/sh. You have to modify src/Makefile and add SHELL variable in the top section of the Makefile:

    SHELL=/bin/bash
    

    Then, you may meet the following error:

    # some message omitted...
    CurlPost.o: In function `CurlPost::clean()':
    CurlPost.cpp:(.text+0x251): no reference to「curl_global_cleanup」
    collect2: error: ld returned 1 exit status
    make[1]: *** [pastebincl] Error 1
    make[1]: Leaving directory `/home/cwchen/src/pastebincl-1.0/src'
    make: *** [pastebincl] Error 2

    In this case, you need to modify the location of $(CXXLIBS) in the following section:

    # before modification...
    $(TARGET): $(OBJS)
            $(CXX) $(CXXLIBS) $^ $(CXXFLAGS) -o $@
    
    # after modification...
    $(TARGET): $(OBJS)
            $(CXX) $^ $(CXXFLAGS) -o $@ $(CXXLIBS)